Composer diagnose显示OK不代表Git克隆可用,因其仅验证git命令存在及版本,不检查SSH密钥、环境变量、~/.ssh/config、私有仓库URL合法性或实际连通性,需手动执行git ls-remote验证。

Git 命令存在但 clone 失败,diagnose 却显示 OK
这很常见:运行 composer diagnose 时看到 Checking git settings: OK,可一执行 composer install 就卡在 Failed to clone。根本原因不是 Git 没装,而是 Composer 启动的子进程环境变量和你终端里不一致——比如 CI 脚本或 Docker 容器中,$PATH、$HOME、$GIT_SSH_COMMAND 或 $SSH_AUTH_SOCK 都可能被重置或缺失。
- 先确认实际执行上下文:在 CI/CD 或容器里跑
composer diagnose时,它用的是当前 shell 环境;但composer install会 fork 新进程,可能丢失 SSH agent 或自定义 PATH - 别只信
git --version输出:它只说明命令可执行,不保证 SSH 密钥能加载。运行git ls-remote git@github.com:your/private-repo.git HEAD才是真实克隆前的最小验证 - Windows Git Bash 用户特别注意:
core.autocrlf设为true或auto会导致 vendor 中文件权限异常,composer diagnose完全不检查这个,但后续 install 会静默失败
diagnose 不报错,但 SSH 连接被静默拦截
composer diagnose 只检测 git 命令是否存在、能否执行 git version,它不会尝试建立 SSH 连接,更不会验证密钥是否可用、ssh-agent 是否活跃、或者 ~/.ssh/config 里是否配置了 Host 别名映射。
- 典型现象:本地 terminal 能
ssh -T git@github.com成功,但composer install报Permission denied (publickey)—— 因为 Composer 的子进程没继承SSH_AUTH_SOCK - 临时验证方式:在项目目录下手动运行
php -r "passthru('git ls-remote git@github.com:your/repo.git HEAD');",复现 Composer 实际调用路径 - Docker 场景下,必须显式挂载 socket:
-v $SSH_AUTH_SOCK:/tmp/ssh-auth-sock -e SSH_AUTH_SOCK=/tmp/ssh-auth-sock,否则diagnose和install看到的是两个世界
Git 配置项冲突导致 diagnose 误判
composer diagnose 会读取 git config --get-regexp 并检查关键项(如 http.sslverify),但它不校验这些配置是否与实际网络环境匹配。比如 http.sslverify = false 在 diagnose 里是 WARNING,但若你用的是自签名证书的私有 Git 服务器,这个设置反而是必需的——而 diagnose 不区分场景,一律标黄。
- 最隐蔽的坑:
git config --global url."https://".insteadOf "git@"这类全局重写规则,会让 diagnose 认为所有 Git 操作走 HTTPS,但实际 clone 时仍按原始 URL 协议发起请求,结果就是 diagnose 通、install 卡住 - 检查真实行为:运行
git -c core.sshCommand= 'ls-remote' git@github.com:org/repo.git,强制绕过配置干扰 - CI 中建议禁用插件和全局配置来隔离问题:
composer diagnose --no-plugins --no-interaction,避免第三方插件修改 Git 行为
私有仓库克隆失败,diagnose 根本不查仓库地址格式
composer diagnose 不解析 composer.json 里的 repositories 配置,也不验证其中的 Git URL 是否合法、是否可达。它只管“Git 命令能不能跑”,不管“Git 命令要连谁”。
- 常见错误:URL 写成
git@gitlab.example.com:group/project.git(缺协议头),diagnose不报错,但composer install会直接抛出fatal: repository 'git@gitlab...' does not exist - 正确写法应为
"url": "git@gitlab.example.com:group/project.git"(vcs类型)或"url": "https://gitlab.example.com/api/v4/groups/group/projects/project"(gitlab类型) - 验证方式:把
repositories里第一个私有源的 URL 拿出来,手工跑git ls-remote $URL HEAD,这是唯一能提前暴露连接问题的操作
git 命令存不存在,而是它在 Composer 启动的那个瞬间,有没有拿到正确的环境、密钥、配置和 URL。diagnose 只告诉你“枪有膛”,不告诉你“子弹有没有上、准星有没有偏”。


















