Composer拉取dev-*分支慢的根本原因是强制Git克隆绕过镜像加速,因镜像仅缓存ZIP包而不托管Git仓库,必须直连原始仓库完整克隆、检出分支并初始化子模块,无法利用--prefer-dist、缓存或并发下载;强制走ZIP需包含dist声明、手动配置repositories为package类型或依赖带tag的@dev版本。

Composer拉取特定分支(比如dev-master或dev-feature/x)慢,根本原因不是“分支本身慢”,而是 Composer 强制走 Git 克隆流程,绕过了镜像加速,且默认不复用已有仓库、不设深度、不跳过检出——这些行为在 CI 或多分支开发中会指数级放大耗时。
为什么dev-*分支拉取不走镜像?
镜像源(如阿里云、清华)只缓存 .zip 发布包(dist),不托管 Git 仓库。当你声明依赖为"monolog/monolog": "dev-main",Composer 就必须:
- 发起 Git clone 请求到原始仓库(如
https://github.com/Seldaek/monolog.git),完全绕过repo.packagist配置 - 执行完整克隆(含全部历史)、checkout 到目标分支、submodule 初始化等操作
- 无法利用
--prefer-dist、cache-files-dir或并发下载优化
怎么强制让分支也走 ZIP 包?
只有满足以下任一条件,Composer 才可能 fallback 到 dist:
- 包作者在
composer.json中显式声明了"dist": { "url": "...", "type": "zip" }(极少见) - 你手动在项目
composer.json的repositories中添加一个 type=package 的条目,指向预构建的 ZIP 地址(需自行维护) - 使用
composer require vendor/package:dev-main --prefer-dist,但前提是该分支有对应 tag 或 GitHub Release(否则仍 fallback 到 git clone)
更现实的做法是:避免直接依赖 dev-* 分支。改用 ^x.y.z@dev(如 "monolog/monolog": "^2.10.0@dev"),它会优先匹配最近的稳定 tag,并启用 dist 下载。
监控一个或多个 GitCode 仓库的 PR,通过 OpenClaw Gateway 自动执行 AI 审查,发布 PR 评论,并发送钉钉和企业微信通知。
Git 克隆阶段还能怎么提速?
若必须走 Git(如内部私有库、未打 tag 的功能分支),可通过环境变量和配置压减开销:
- 设
COMPOSER_DISABLE_FS_CHECKS=1:跳过 Git 工作区完整性校验(CI 中安全) - 加
--no-interaction+--quiet:减少终端 I/O 和 prompt 等待 - 用
git config --global core.sparseCheckout true配合.git/info/sparse-checkout(需自定义脚本注入)来跳过无关目录 - 禁止 submodule:
COMPOSER_NO_INTERACTION=1 git clone --depth=1 --no-single-branch --recursive=false ...(Composer 不直接支持,需 patch 或 wrapper 脚本)
注意:--depth=1 在 Composer 内部不可控,它始终用 git clone 而非 git archive,所以浅克隆需靠 Git 全局配置或提前 cache。
CI 中拉取 dev 分支卡住?先查这三件事
CI 日志里出现 Cloning into '...'... 卡住超过 60 秒,大概率不是网络问题:
-
ssh-agent未启动或 key 未加载 —— 改用 HTTPS URL(https://git.example.com/repo.git),并配COMPOSER_AUTHJSON - Docker 容器内 DNS 缓存失效 —— 在
before_script加nslookup github.com和getent hosts github.com验证解析 - Git 仓库启用了 large file storage(LFS)但 CI runner 没装
git-lfs—— 直接报错或静默卡死
真正难排查的是:某些私有 Git 服务(如 Gitea、GitLab CE)对未认证的 git ls-remote 请求响应极慢,Composer 在确定分支 commit hash 前会先发这个请求 —— 此时加 COMPOSER_VERBOSE=1 可看到卡在哪一步。

















