composer 本身不管理 ssh 密钥,所有认证由 git 和系统 ssh 层完成;必须验证 ssh -t、ssh-add -l 和手动 git clone 三步,并确保 ~/.ssh/config 主机名匹配、composer.json 中 url 为 git@ 格式且 name 字段大小写严格一致。

Composer 本身不提供“配置 SSH 密钥路径”的命令 —— 它完全不读取、不管理、也不接受你传入的密钥路径参数。所有 SSH 密钥路径控制,都必须由 Git 和系统 SSH 层完成。你执行 composer install 时卡在 Cloning into '/tmp/xxx',问题一定出在 git clone git@host:path.git 这一步静默失败,而不是 Composer 没“配对”密钥。
为什么 composer install 会卡住或报 Permission denied (publickey)
这不是 Composer 的错误,而是 Git 在调用 ssh 命令时找不到可用密钥、或密钥未加载、或主机名不匹配导致认证被拒。常见现象包括:
- 终端光标停住,无任何输出(Git 等待密码输入,但 Composer 不接管 stdin)
- 日志里出现
Cloning into '/tmp/xxx'后直接退出或超时 - CI 中报错
Permission denied (publickey),但本地测试却正常
根本原因永远是:Git 无法用 SSH 静默连接目标服务器。Composer 只是触发了这个过程。
必须手动验证三件事,缺一不可
跳过任一环节,90% 的失败就已注定。请按顺序执行:
- 运行
ssh -T git@github.com(把github.com换成你的实际域名,如gitlab.example.com),必须看到Hi username! You've successfully authenticated - 运行
ssh-add -l,确认私钥已加载;若无输出,执行ssh-add ~/.ssh/id_ed25519(路径按你生成的密钥实际位置调整) - 手动运行
git clone git@github.com:org/private-repo.git,必须完整拉下代码,中途不能输密码、不能中断
注意:~/.ssh/id_ed25519 文件权限必须是 600(chmod 600 ~/.ssh/id_ed25519),否则 ssh-add 会静默拒绝。
如何让 Git 知道该用哪把密钥连哪个主机
多私有仓库共存(比如 GitHub + GitLab + 自建 Gitea)时,不能只靠默认密钥。必须靠 ~/.ssh/config 显式分流:
围绕关键发现、作用机制、临床相关性及研究局限性展开讨论。适用于撰写或优化任何生物医学论文的“讨论(Discussion)”部分——包括结果解读、与既往文献关联、阐释意外发现、界定研究局限性,以及撰写结论。当用户输入以下任一指令时也会自动触发该功能: - “write my discussion” - “help me discuss my findings” - “how do I compare to prior studies” - “write the limitations par
- 每段
Host必须和仓库 URL 中的主机名**完全一致**(如gitlab.example.com,不能写gitlab) -
User字段必须填git(所有主流平台 SSH 入口用户都是git) -
IdentityFile指向对应私钥的绝对路径(例如~/.ssh/gitlab_id_ed25519)
示例配置:
Host github.com User git IdentityFile ~/.ssh/github_id_ed25519 Host gitlab.example.com User git IdentityFile ~/.ssh/gitlab_id_ed25519
配置后,再测试 ssh -T git@github.com 和 ssh -T git@gitlab.example.com 是否各自返回对应欢迎信息。
composer.json 里写 SSH 地址的硬性规则
即使 SSH 连通性全部验证通过,composer.json 写错一个字符也会让 Composer 忽略整个仓库:
-
"type"字段必须是"vcs",不是"git"、"package",也不能留空 -
"url"必须是完整 SSH 格式:"git@github.com:org/private-repo.git"(冒号分隔、以.git结尾) -
require中的包名(如"org/private-repo")必须和私有库根目录下composer.json中的"name"字段**逐字符一致**(大小写敏感)
别指望 Composer 自动 fallback 或纠错 —— 它只做字面匹配。写错一个斜杠、少一个 .git、大小写不一致,它就会安静地跳过你的仓库,转头去 Packagist 找包,然后报 Could not find package。
最易被忽略的点:私钥文件权限、~/.ssh/config 中 Host 名与 URL 主机名是否完全一致、以及 composer.json 中 name 和 require 的大小写是否咬死。这些地方出错,不会报明确错误,只会静默失败。










