答案是先用 ssh -T git@github.com 直接验证 SSH 连接,若失败则说明 Git 的 SSH 配置有误;若使用 Host 别名(如 github-work),必须用对应别名测试且 composer.json 中 URL 需同步改为 git@github-work:user/repo.git,同时确保 ~/.ssh/config 权限正确、语法无误并含 IdentitiesOnly yes。

确认 SSH 连接是否能通,别让 Composer 背锅
Composer 本身不处理 SSH 认证,它只是调用 git clone。报 “Permission denied (publickey)” 或 “Cloning failed using an ssh key” 时,问题一定出在 Git 的 SSH 配置环节,不是 Composer 没配好,而是你本地的 SSH 没配对。
先绕过 Composer 直接验证 SSH:
- 运行
ssh -T git@github.com—— 如果失败,说明默认 Host 没配密钥或密钥权限不对(chmod 600 ~/.ssh/id_rsa*必做) - 如果你用了别名(如
github-work),必须用别名测试:ssh -T git@github-work,不能只测github.com - 失败时看输出里有没有
Offering RSA public key或no mutual signature algorithm—— 前者说明密钥没被接受,后者常因 OpenSSH 9.8+ 默认禁用 RSA-SHA1
检查 composer.json 里的仓库 URL 是否匹配 SSH 配置
哪怕 SSH 别名配置完全正确,只要 composer.json 里写的是 git@github.com:user/repo.git,Git 就不会读 ~/.ssh/config 里为 github-work 写的规则,直接走默认 github.com —— 而这个 Host 很可能根本没配密钥。
必须手动改 URL:
围绕关键发现、作用机制、临床相关性及研究局限性展开讨论。适用于撰写或优化任何生物医学论文的“讨论(Discussion)”部分——包括结果解读、与既往文献关联、阐释意外发现、界定研究局限性,以及撰写结论。当用户输入以下任一指令时也会自动触发该功能: - “write my discussion” - “help me discuss my findings” - “how do I compare to prior studies” - “write the limitations par
- 把
git@github.com:user/repo.git改成git@github-work:user/repo.git(对应你~/.ssh/config里定义的 Host 名) - 确保所有
repositories项的url都是git@xxx:开头,不含https://或git:// - 如果用了私有 GitLab 或公司内网仓库,同样要改成你 SSH config 里定义的 Host 别名,比如
git@gitlab-internal:group/project.git
验证 ~/.ssh/config 是否生效且无语法错误
~/.ssh/config 文件对大小写、缩进、空行都敏感,写错一行就全失效。常见坑点:
- Host 行末尾不能有多余空格,比如
Host github-work(末尾空格会导致匹配失败) - 必须包含
HostName github.com(不是 Host)、User git、IdentityFile ~/.ssh/id_rsa_work和IdentitiesOnly yes - 多个 Host 块之间不能用空行隔开(OpenSSH 8.9+ 开始部分版本会跳过空行后的块)
- 路径里的
~在某些环境下不展开,建议写绝对路径:IdentityFile /home/you/.ssh/id_rsa_work
警惕 HTTPS 回退掩盖真实问题
Composer 在某次 SSH clone 失败后,可能缓存失败状态,后续自动降级走 HTTPS —— 这时候 composer install 看似成功了,但其实根本没走你配的 SSH 密钥,只是绕开了问题。
怎么确认它真在走 SSH:
- 加
-vvv参数运行:composer install -vvv | grep "git clone",看日志里实际执行的命令是不是git clone git@xxx: - 删掉
vendor/和composer.lock,再清缓存:composer clear-cache,避免旧状态干扰 - 临时禁用 HTTPS fallback:在
composer.json里加"secure-http": true,强制只走 HTTPS 或 SSH,不自动降级
多密钥场景下,最易被忽略的是 URL 和 SSH config 的 Host 名不一致,以及 ~/.ssh/config 里漏了 IdentitiesOnly yes —— 这个开关不开,OpenSSH 可能尝试发送所有密钥,触发 GitHub 的速率限制或拒绝。

















