Git版本低于2.10会导致Composer调用git clone失败,因不支持--shallow-since等参数;应升级Git至2.10+(CentOS 7推荐IUS仓库安装git222),配置TLS 1.2,并确保Composer实际调用新版Git路径。

Git --version 低于 2.10 就别硬扛了
Composer 本身不带 Git,所有 git clone 都是调用系统命令。CentOS 7 默认的 git 1.8.3、Ubuntu 16.04 的 2.7.4,遇到现代仓库(尤其是启用了 --shallow-since 或 --filter=blob:none 的 Composer 2.x)会直接报错:error: unknown option `shallow-since' 或 fatal: unrecognized argument: --filter=blob:none。这不是配置问题,是二进制不支持。
- 先跑
git --version—— 结果< 2.10?直接升级,别试--no-shallow或降级协议 - CentOS/RHEL 7 用户走 IUS:先装
https://repo.ius.io/ius-release-el7.rpm,再yum install git222(得 Git 2.22+) - macOS 用
brew install git,别信 Xcode 自带的阉割版;Windows 装 Git for Windows 时务必勾选“Add Git to the system PATH” - 升级后执行
git config --global http.sslVersion tlsv1.2,防止旧系统默认用 TLS 1.0
Composer 还在调旧版 Git?查 PATH 和实际调用路径
升级完 git --version 显示新版本,但 composer install 仍失败?大概率是 Composer 没找到新二进制。它不读当前 shell 的 $PATH 缓存,而是继承父进程环境,或被硬编码指向 /usr/bin/git。
GitHub Hosts 更新工具(仅限中国用户),安全更新系统hosts文件,保留原有非GitHub条目,仅替换GitHub相关地址。支持备份恢复和风险提示。用于解决GitHub访问问题。
- Linux 下用
strace -e trace=execve composer install 2>&1 | grep git看它真调了哪个路径 - 确认新版
git所在目录(如/usr/local/bin/git或/opt/git/bin/git)已加到$PATH最前面,并新开终端验证 - 强制指定:运行
composer config -g bin-dir /usr/local/bin,再确保该目录下有新版git符号链接 - Docker 或 CI 中,不能只装新 Git,还得
ENV PATH="/usr/local/bin:$PATH",否则镜像层里 PATH 没变
临时绕不开旧 Git?退 Composer 1.x 是最稳的兜底方案
某些生产环境锁死 OS 版本、无法升级 Git,又必须用 --prefer-source,这时强行打补丁(比如改 Composer 源码或塞 --no-shallow)风险高。Composer 1.x(如 1.10.22)压根不生成 --shallow-since 类参数,天然兼容老 Git。
- 下载指定版本:
curl -sS https://getcomposer.org/installer | php -- --version=1.10.22 - 替换原有
composer.phar,或重命名保留:mv composer.phar composer1.phar - 后续用
php composer1.phar install --prefer-source,不改任何配置也能过 - 注意:Composer 1.x 不支持 PHP 8.2+ 新语法,若项目已用 PHP 8.2,此法失效
删 vendor 和 lock 文件前,先确认是不是 Git 问题
看到 git clone failed 就删 vendor/ 和 composer.lock 再重装?错。如果底层 Git 不行,重装只是重复失败,还可能污染 lock 文件里的 commit hash(旧 Git 浅克隆失败后留下的残缺 .git 目录会被 Composer 误读)。
- 先单独测:
git clone https://github.com/symfony/symfony.git --depth=1 --shallow-since="2023-01-01" /tmp/test—— 报错就坐实 Git 问题 - 确认是 Git 导致后,升级或切换版本,再删
vendor/和composer.lock - 千万别在旧 Git 环境下跑
composer update --prefer-source,它会把损坏的 .git 目录留在 vendor 里,下次 install 更难清理

















