Composer install 拉取 .git 目录通常因启用 prefer-source 模式或使用 path 仓库所致;可通过 composer config --list 检查配置,并用 ls -la vendor/pkg/.git 验证;禁用方式包括设 preferred-install 为 dist 或改用 dist 发布。

Composer install 为什么会拉取 .git 目录?
默认情况下,composer install 不会下载 .git 目录——但如果你看到 vendor/ 下某个包里存在 .git/,基本可以确定:这个包是通过 path 或 package 类型的本地源安装的,或者你启用了 prefer-source 模式。
prefer-source 会让 Composer 克隆 Git 仓库(而非下载 zip 包),因此保留完整的 .git/ 结构。常见触发场景包括:
- 执行了
composer install --prefer-source或composer update --prefer-source - 在
composer.json中设置了"config": { "preferred-install": "source" } - 使用了
pathrepository(例如本地开发时指向../my-package),且该路径本身是个 Git 仓库
如何确认是不是 prefer-source 导致的?
运行以下命令检查当前配置:
composer config --list | grep preferred-install
如果输出类似 preferred-install: {"*": "source"} 或 preferred-install: "source",就坐实了问题根源。
再验证某个具体包是否以 source 方式安装:
ls -la vendor/myvendor/mypackage/.git
如果能列出内容,说明它确实是 clone 来的;而 zip 安装方式下该目录不存在。
如何避免或清理 vendor 中的 .git 目录?
有两类处理方式,按需选择:
- 全局禁用 source 安装:执行
composer config --global preferred-install "dist"(注意加--global影响所有项目) - 仅对当前项目禁用:在项目根目录下运行
composer config preferred-install "dist",会写入本地composer.json的config字段 - 临时覆盖:下次 install/update 时显式加上
--prefer-dist参数 - 手动清理(不推荐长期用):
find vendor -name ".git" -type d -exec rm -rf {} +,但下次--prefer-source还会回来
注意:path 类型仓库不受 prefer-dist 控制——只要源路径含 .git,就会被原样复制进来。这种情况下,要么改用 dist 发布流程(如 packagist.org 托管),要么在 CI/CD 中用 rsync --exclude=.git 同步。
为什么有些团队反而需要 vendor/.git?
少数场景下保留它是有意为之:
- 调试时需
git blame或git log查看某行代码的提交来源 - CI 构建中依赖子模块或 Git hooks(极少见,通常设计不合理)
- 内部私有包用
path引入,又希望保留 commit hash 做版本审计
但要注意:这些 .git 目录会显著增大 vendor/ 体积(尤其历史较长的包),且可能意外提交到你自己的 Git 仓库(如果 .gitignore 没写好 /vendor/**/.git)。最隐蔽的问题是:某些 IDE 或静态分析工具会递归扫描 vendor/ 下所有 .git,导致卡顿或误报。










