composer 能通过 ssh 访问内网私有 git 仓库,前提是 ssh -t git@your-git-server.com 成功且 git ls-remote 通;需严格匹配 ~/.ssh/config host、使用 type: "vcs" 和完整 ssh url(git@host:group/repo.git),并确保包名、分支名一致,清除缓存后执行 composer install --no-cache。

Composer 能否通过 SSH 访问内网私有 Git 仓库,取决于你本地 git clone 是否真能走 SSH 成功——不是“配了密钥就行”,而是 ssh -T 和 git ls-remote 都得通,否则 Composer 会静默 fallback 到 HTTPS 或直接报 Permission denied (publickey)。
ssh -T git@your-git-server.com 必须成功
这是所有配置的前提。内网环境常见失败点不是密钥没生成,而是:
-
ssh -T报The authenticity of host 'xxx' can't be established:这是首次连接未验证 host key,需手动执行一次ssh -o StrictHostKeyChecking=no -T git@your-git-server.com(仅限可信内网),或把目标服务器的 host key 手动追加到~/.ssh/known_hosts - 公钥已上传但
ssh -T仍提示Permission denied:检查~/.ssh/config中Host行是否与 URL 域名**逐字匹配**(比如 URL 是git@10.0.1.5:group/repo.git,Host就必须写10.0.1.5,不能写git.internal除非你额外配了 DNS 或 hosts) - 私钥有密码但没加载:运行
ssh-add ~/.ssh/id_ed25519;若ssh-add -l为空,说明 agent 没启动或密钥没加进去
composer.json 中 repositories 必须用 type: "vcs" + 完整 SSH URL
内网地址往往不标准(如 IP、自定义域名、非标端口),URL 格式稍错就会降级 HTTPS 或解析失败:
工作流任务拆解与模型编排技能。使用场景:(1) 收到复杂工作任务需要拆解为可执行步骤,(2) 需要为不同步骤选择最合适的模型,(3) 需要跟踪工作流进度和模型使用情况,(4) 长时间任务卡住需要问题诊断和解决方案。
-
url必须是git@xxx:group/repo.git形式(冒号分隔,以.git结尾);写成git@xxx/group/repo.git(斜杠)会被 Git 当作路径处理,报fatal: Could not read from remote repository -
type字段**必须显式写"vcs"**,不能省略、不能写"git"或"package";否则 Composer 不触发git clone流程 - 若内网 Git 服务用非标端口(如 2222),
url不能直接写端口,得靠~/.ssh/config映射:Host 10.0.1.5 HostName 10.0.1.5 Port 2222 User git IdentityFile ~/.ssh/id_rsa_internal
然后url写git@10.0.1.5:group/repo.git
require 的包名必须和私有库 composer.json 的 name 字段完全一致
内网项目常因命名随意导致拉取失败,且 Composer 不报明确提示:
- 假设私有库根目录下
composer.json写的是"name": "acme/internal-sdk",那么主项目require里就得写"acme/internal-sdk": "dev-main" - 大小写、斜杠方向、vendor 名哪怕差一个字符(如
ACME/internal-sdk或acme/internal_sdk)都会找不到包 - 分支名(如
dev-main)必须真实存在;内网 GitLab 默认保护main分支,需进后台取消保护或改用其他分支
缓存污染是内网调试中最容易被跳过的环节
一旦改过 SSH 配置、换了密钥、或修改了 ~/.ssh/config,旧缓存会让 Composer 死卡在 Cloning into '...' 或复现旧错误:
- 删掉
vendor/下对应包目录 - 删掉
composer.lock中该包的整行(或整个文件) - 执行
composer clear-cache - 最后再跑
composer install --no-cache(加--no-cache强制跳过本地 dist 缓存)
内网环境尤其要注意:如果私有仓库用了 Git submodule,还得确认 git config --global submodule.recurse true 已启用,否则子模块不会被拉取。










