git@协议在内网或CI中卡住,因默认走SSH(端口22),而环境常禁用该端口或未配置SSH密钥;应使用git config --global url."https://..." insteadOf "git@..."全局重写协议,使Git自动将git@地址转为HTTPS,避免手动修改composer.json且兼容所有包。

为什么git@协议在内网或CI里直接卡住?
Git 默认走 SSH(git@github.com:org/repo.git),但很多环境禁用 22 端口,或未部署 SSH key,导致 composer install 卡在 Cloning into 'vendor/package'...,且无明确错误提示。这不是 Composer 报错,而是 Git 层静默 hang 住。
- 常见现象:命令长时间无响应,Ctrl+C 后看到最后一行是
Cloning,但没报Permission denied (publickey)或Connection refused - 根本原因:Composer 生成的仓库地址含
git@,而 Git 尝试走 SSH 连接,但网络不通或认证缺失 - 不要改
composer.json里的 URL —— 每个包都可能带git@地址,手动替换不可维护,且上游迁移后立即失效
用git config --global url.重写协议最干净
让 Git 自己把所有 git@ 地址转成 HTTPS,不依赖 Composer 版本,也不影响 secure-http 判断(因为协议转换发生在 Git 层,Composer 只看到最终 URL)。
- 执行以下命令全局生效:
git config --global url."https://www.php.cn/link/536f4ea1075a3900f3791bf4097880fc".insteadOf "git@github.com:" git config --global url."https://gitlab.com/".insteadOf "git@gitlab.com:" git config --global url."https://gitee.com/".insteadOf "git@gitee.com:"
- 若私有 Git 服务域名是
git.internal.org,补上:git config --global url."https://git.internal.org/".insteadOf "git@git.internal.org:"
- 注意:
insteadOf规则必须以:结尾(如git@github.com:),否则不匹配 - 验证是否生效:运行
git ls-remote <a href="https://www.php.cn/link/062eb81d4674705d10c8ecb848358cb3">https://www.php.cn/link/062eb81d4674705d10c8ecb848358cb3</a>,应能列出 refs;再试git ls-remote git@github.com:composer/composer.git,也应走 HTTPS 成功
composer config -g default-protocol https只管“自动推导”的地址
这条命令让 Composer 把没写死协议的 VCS 地址(比如 "vendor/package" 这种简写)默认补成 HTTPS,但它不会动已写死的 git@ 或 https://。
- 它适用于:项目里用的是包名简写,依赖由 Packagist 解析出地址,此时 Composer 会生成
<a href="https://www.php.cn/link/536f4ea1075a3900f3791bf4097880fc">https://www.php.cn/link/536f4ea1075a3900f3791bf4097880fc</a>...而非git@... - 它不适用于:repositories 里显式写了
"url": "git@gitlab.com:org/repo.git",这种硬编码地址完全绕过该配置 - 可选值只有
https、ssh、git、http;http不推荐,secure-http开启后会被直接拒绝
HTTPS 回退失败?检查认证和超时
Git 协议切到 HTTPS 后,常见新问题不是连不上,而是认证失败或超时:
- 私有仓库若需 Token 认证,确保已配置 Git 凭据管理器(如
git config --global credential.helper store),或在 URL 中嵌入 Token:<a href="https://www.php.cn/link/4e13cab9991e5cfbfcdc71acc908495b">https://www.php.cn/link/4e13cab9991e5cfbfcdc71acc908495b</a> - 内网镜像若返回 502/404,Composer 默认会卡住等待,需加超时:设环境变量
COMPOSER_HTTP_TIMEOUT=5或在全局 config 中加"http": {"timeout": 5} - 若用国内镜像(如阿里云),确认其 HTTPS 地址有效:
<a href="https://www.php.cn/link/1569ae888190eb8c53b218b0d529e1e9">https://www.php.cn/link/1569ae888190eb8c53b218b0d529e1e9</a>;旧 HTTP 地址已被secure-http拒绝
真正卡住的地方往往不在协议切换本身,而在 Git 凭据缺失、镜像 DNS 解析失败、或缓存里还存着旧的 git@ 元数据快照——换协议前先 composer clear-cache,比反复调参数更省时间。


















