根本原因是 composer 调用 git clone 时未使用 ssh 别名,因 composer.json 中仓库 url 未与 ~/.ssh/config 的 host 名完全一致(如应为 git@github-work:user/repo.git 而非 git@github.com:user/repo.git),导致 ssh 配置不生效;此外 ssh-agent 未加载对应密钥、密钥权限非600、缓存降级至 https 或 repositories 空数组覆盖配置也会引发同类问题。

直接原因不是 Composer 缺密钥,而是它调用 git clone 时没走你配好的 SSH 别名——URL 写错了。
composer.json 里的仓库 URL 必须用 Host 别名
如果你在 ~/.ssh/config 里写了:
Host github-work HostName github.com User git IdentityFile ~/.ssh/id_rsa_work
那 composer.json 中对应的仓库 URL 就不能写 git@github.com:user/repo.git,必须写成:
围绕关键发现、作用机制、临床相关性及研究局限性展开讨论。适用于撰写或优化任何生物医学论文的“讨论(Discussion)”部分——包括结果解读、与既往文献关联、阐释意外发现、界定研究局限性,以及撰写结论。当用户输入以下任一指令时也会自动触发该功能: - “write my discussion” - “help me discuss my findings” - “how do I compare to prior studies” - “write the limitations par
git@github-work:user/repo.git- 漏掉
-work后缀,Git 就不会读~/.ssh/config里那段配置,直接连默认的github.com,而那个 Host 往往没配密钥或权限不对 - GitLab、Gitee 等同理:URL 必须和
~/.ssh/config中的Host行完全一致
ssh-agent 没加载对应密钥或权限不对
即使 URL 对了,ssh -T git@github-work 仍报 Permission denied (publickey),常见原因:
- 密钥文件权限不是
600:chmod 600 ~/.ssh/id_rsa_work - ssh-agent 没加载该密钥:
ssh-add -D清空后,再ssh-add ~/.ssh/id_rsa_work - 系统用了多个 ssh-agent(比如 VS Code 终端自带一个、iTerm 又起一个),导致你在终端里
ssh-add成功,但 Composer 调用的 Git 进程没继承到这个 agent
Composer 日志里实际跑的是 HTTPS 不是 SSH
看起来报错是 SSH 相关,但 composer install -vvv 日志里却出现 git clone https://...,说明:
- 某次失败后 Composer 缓存了降级策略,后续自动 fallback 到 HTTPS —— 而 HTTPS 完全不走 SSH 配置
- 你改过
composer.json但没清缓存:composer clear-cache或手动删掉~/.composer/cache/vcs/ - 项目里存在
"repositories": []这种空数组,会覆盖全局配置,让 Composer 回退到默认源(含 HTTPS fallback)
最常被忽略的一点:SSH 配置只影响 git@ 开头的 URL;一旦 Composer 因任何原因开始走 HTTPS,所有 ~/.ssh/config 设置都失效。验证是否真在走 SSH,唯一可靠方式是看 -vvv 日志里每一条 git clone 命令的完整 URL。别信报错信息表面写的协议。










