必须先让 ssh -T 成功,否则 Composer 一定失败——不是权限问题,是根本没连上;需确保 ssh -T git@your-host-alias 返回 welcome 信息,且 ~/.ssh/config 的 Host 名与 composer.json 中 URL 的主机名逐字一致,密钥已通过 ssh-add 加载,type 为 "vcs"、url 为完整 SSH 格式(git@host:path/repo.git)。

必须先让 ssh -T 成功,否则 Composer 一定失败——不是权限问题,是根本没连上。
确认 SSH 连接通不通,别跳过这步
Composer 拉私有 Git 仓库时,底层调用的是 git clone,而 git 完全依赖系统 SSH 配置。如果 ssh -T git@your-host-alias 报错或卡住,composer install 必然失败,且错误信息(比如 repository '' not found 或 Permission denied (publickey))极具误导性。
你应该手动执行一次:
ssh -T git@github-personal
其中 github-personal 是你 ~/.ssh/config 里定义的 Host 别名。成功返回类似 Hi username! You've successfully authenticated... 才算过关。
- 报
The authenticity of host 'xxx' can't be established:说明首次连接,ssh没法自动确认 host key;可临时加参数运行:ssh -o StrictHostKeyChecking=no -T git@your-host-alias(仅限可信内网),或手动把目标服务器公钥追加到~/.ssh/known_hosts - 报
Permission denied (publickey):大概率是~/.ssh/config中的Host名与composer.json里的 URL 主机名不一致,比如 URL 写了git@10.0.1.5:repo.git,但 config 里Host行写的是git.internal——必须逐字匹配
~/.ssh/config 必须严格对齐 URL 中的 Host 别名
Composer 不解析真实域名,只查 ~/.ssh/config 里有没有完全匹配的 Host 条目。哪怕差一个字母,SSH 就会降级走系统默认配置,而那个默认配置通常没配密钥。
工作流任务拆解与模型编排技能。使用场景:(1) 收到复杂工作任务需要拆解为可执行步骤,(2) 需要为不同步骤选择最合适的模型,(3) 需要跟踪工作流进度和模型使用情况,(4) 长时间任务卡住需要问题诊断和解决方案。
例如:
- ✅ 正确:
"url": "git@github-personal:user/private-repo.git",对应 config 中:Host github-personal+HostName github.com - ❌ 错误:
"url": "git@github.com:user/private-repo.git",即使你为github.com配了密钥,但 config 里写的是Host github-personal,Git 就不会用它 - ⚠️ GitLab 子组路径陷阱:
git@gitlab-company:topgroup/subgroup/project.git合法,但如果你在 config 里把HostName写成gitlab.example.com/topgroup,SSH 会尝试连接主机名gitlab.example.com/topgroup(含斜杠),直接失败
密钥得被 ssh-agent 加载,且权限要对
运行 ssh-add -l,如果输出为空,说明 agent 没加载密钥。这不是 Composer 的问题,是系统层缺失。
- 确保
ssh-agent已启动(Linux/macOS 通常开机自启;Windows WSL 需手动eval $(ssh-agent)) - 运行
ssh-add ~/.ssh/id_ed25519(或你实际的私钥路径);如果密钥有密码,此时会提示输入 - 私钥文件权限必须是
600:chmod 600 ~/.ssh/id_ed25519,否则ssh会拒绝读取 - 检查
~/.ssh/config中是否指定了IdentityFile,且路径正确、可读
composer.json 里 URL 和 type 字段不能错一个字符
Composer 对 VCS 仓库配置极其敏感。只要 type 不是 vcs,或 url 不是完整 SSH 格式(git@host:path/repo.git),就会静默降级或报错。
最小可用配置示例:
{
"repositories": [
{
"type": "vcs",
"url": "git@github-personal:user/private-repo.git"
}
],
"require": {
"user/private-repo": "^1.0"
}
}
-
url必须以git@开头,不能是https://或缺省协议 -
type字段值必须是字符串"vcs",大小写敏感,不能漏引号 - 包名
user/private-repo必须和私有仓库中composer.json的name字段完全一致
真正容易被忽略的是:所有环节都依赖 ssh -T 能通这个前提。一旦这里卡住,后面所有调试都是徒劳。别信错误信息说“包不存在”,先看 SSH 连没连上。

















