必须加--prefer-source且配合--keep-vcs才能保留.git目录;因--prefer-source仅强制git clone,而composer默认检出后即删除.git,--keep-vcs才是保留它的唯一开关。

必须加 --prefer-source,但光加它还不够——默认仍会删掉 .git 目录;要真正保留 Git 记录,还得补上 --keep-vcs。
为什么 --prefer-source 本身不保留 .git
Composer 在执行 git clone 后,默认会做两件事:git checkout -qf <commit></commit>(检出指定提交),然后直接 rm -rf .git。这是为了减小 vendor 体积、避免部署时意外提交或泄露敏感钩子。
-
--prefer-source只控制「从哪来」:强制走 Git 克隆而非 ZIP 下载 - 它不控制「留下什么」:.git 目录是否保留,由另一机制决定
- 验证方式:进
vendor/foo/bar执行git remote -v,若报not a git repository,说明已被删
--keep-vcs 是保留 .git 的唯一开关
这个参数告诉 Composer:克隆完别删 .git,原样留下。它适用于所有支持 VCS 的安装动作,包括 install、update 和 create-project。
- 必须和
--prefer-source配合使用,单独用--keep-vcs无效(因为 dist 模式根本没.git可留) - 命令示例:
composer install --prefer-source --keep-vcs - 全局启用?不行——
--keep-vcs没有配置项,只能命令行传参 - 副作用明显:vendor 整体体积可能翻 5–10 倍;CI 构建时间拉长;后续
composer update若检测到本地有未提交修改,会中止并报错
哪些包即使加了参数也拿不到 .git
不是所有包都支持源码克隆。Composer 只在包的 composer.json 中存在有效 source 字段时,才尝试 git clone。否则自动 fallback 到 dist。
- 检查方法:
composer show vendor/package | grep source,无输出即不支持 - 常见不支持场景:type 为
metapackage、只填了dist、source.url 是私有地址但本地没配 SSH key 或 token - 镜像源问题:阿里云、腾讯云等 Packagist 镜像通常不代理 Git 请求,
--prefer-source在用镜像时大概率失败 - 私有包需额外配置:
repositories中声明type: "vcs"并提供可读 Git 地址,否则 Composer 根本不知道去哪 clone
create-project 场景下特别注意
用 composer create-project 初始化项目时,--prefer-source 控制的是「模板项目本身怎么拉」,而 --keep-vcs 控制的是「是否保留模板项目的 .git」——两者作用对象不同,但常被混用。
- 想基于 Laravel 源码二次开发?必须同时加:
composer create-project laravel/laravel myapp --prefer-source --keep-vcs - 若目标目录已存在
.git,Composer 会直接报错退出,不会覆盖——得先清空目录 -
--keep-vcs不等于「自动同步上游」:它只是保留原始.git/config和HEAD,不会帮你git pull或切换分支
真正容易被忽略的是缓存行为:~/.composer/cache/vcs/ 下的 Git 镜像会被复用,哪怕你改了 source 地址或 reference,Composer 也可能直接从本地镜像 checkout 老 commit。要彻底刷新,得手动删对应路径,或用 composer clear-cache 配合 --prefer-source --keep-vcs 重装。











