Composer卡在Cloning或报错是因GitHub的Git/SSH协议被阻断或HTTPS握手超时;改composer.json的repositories无效,因镜像仅加速元数据查询,下载仍走包定义的source.url;正确做法是配置Git全局代理并启用composer config --global github-protocols https强制转HTTPS。

Composer 安装或更新时卡在 Cloning into 'xxx'... 或报错 Failed to clone https://github.com/xxx/xxx.git,大概率不是网络断了,而是 GitHub 的 Git 协议(git:// 或 ssh://git@github.com)被阻断,或 HTTPS 请求因 DNS / TLS 握手慢导致超时 —— 直接配代理或换镜像源能解决,但方式不对反而会触发新问题。
为什么改 composer.json 的 repositories 不管用?
很多人在项目根目录的 composer.json 里加了国内镜像源(比如阿里、腾讯),但发现 composer install 依然连 GitHub,这是因为:
• Composer 只对「包元数据」(packagist.org 上的 name/version 列表)走镜像;
• 真正下载代码时,仍按包定义里的 source.url(通常是原始 GitHub HTTPS 或 Git 地址)拉取;
• 某些包(尤其是 "type": "vcs" 或私有仓库)甚至完全绕过 Packagist,直接克隆原始地址。
正确设置全局 Git 协议代理(推荐)
Composer 底层调用 git clone,所以最稳的方式是让系统 Git 走代理,而不是动 Composer 配置:
• 若你本地已配置好 HTTP(S) 代理(如 127.0.0.1:7890),运行:
git config --global http.proxy http://127.0.0.1:7890 git config --global https.proxy http://127.0.0.1:7890
• 如果代理需认证,写成 http://user:pass@127.0.0.1:7890;
• 若只希望 Composer 走代理(不影响其他 Git 操作),去掉 --global,并在项目目录下执行(会写入 .git/config);
• 注意:Git 代理不作用于 ssh://git@github.com,遇到这类地址需改用 HTTPS 方式(见下一条)。
强制 Composer 使用 HTTPS 替代 Git/SSH 协议
GitHub 默认允许 git:// 和 ssh://,但这两者在国内极不稳定。可让 Composer 统一转为 HTTPS 克隆:
• 执行命令启用重写:
composer config --global github-protocols https
• 这会把所有 git@github.com:xxx/yyy.git 或 git://github.com/xxx/yyy.git 自动转成 https://github.com/xxx/yyy.git;
• 同时确保 Git 已配置 HTTPS 代理(上一步),否则只是换个协议继续超时;
• 验证是否生效:运行 composer show vendor/package,看 source 字段是否已变成 https 开头。
镜像源 ≠ 下载加速,别混淆两个层级
很多人以为设了 composer config --global repo.packagist composer https://mirrors.aliyun.com/composer/ 就万事大吉,其实这只是加速「查版本」,不加速「下代码」。
• Packagist 镜像只缓存 packages.json 和 dist 归档(zip/tar)链接;
• 但很多包(尤其 dev 分支、未打 tag 的提交)仍走 source(即 Git 克隆),这时镜像无能为力;
• 更隐蔽的坑:某些 dist 包的 URL 是 GitHub Release 地址(https://api.github.com/.../archive/xxx.zip),它不受 Packagist 镜像控制,仍需代理或科学上网。










