Composer install 拉取 .git 目录通常因启用 prefer-source 模式或使用 path 仓库所致;可通过 composer config --list 检查配置,并用 ls -la vendor/pkg/.git 验证;禁用方式包括设 preferred-install 为 dist 或改用 dist 发布。
默认情况下,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" }
path repository(例如本地开发时指向 ../my-package),且该路径本身是个 Git 仓库运行以下命令检查当前配置:
composer config --list | grep preferred-install
如果输出类似 preferred-install: {"*": "source"} 或 preferred-install: "source",就坐实了问题根源。
再验证某个具体包是否以 source 方式安装:
ls -la vendor/myvendor/mypackage/.git
如果能列出内容,说明它确实是 clone 来的;而 zip 安装方式下该目录不存在。
有两类处理方式,按需选择:
composer config --global preferred-install "dist"(注意加 --global 影响所有项目)composer config preferred-install "dist",会写入本地 composer.json 的 config 字段--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 同步。
少数场景下保留它是有意为之:
git blame 或 git log 查看某行代码的提交来源path 引入,又希望保留 commit hash 做版本审计但要注意:这些 .git 目录会显著增大 vendor/ 体积(尤其历史较长的包),且可能意外提交到你自己的 Git 仓库(如果 .gitignore 没写好 /vendor/**/.git)。最隐蔽的问题是:某些 IDE 或静态分析工具会递归扫描 vendor/ 下所有 .git,导致卡顿或误报。
# js
# 它是
# 还会
# 如果你
# 是个
# 就会
# 下次
# 情况下
# 自己的
# ide
# 递归
# red
# 为什么
# 工具
# composer
# json
# git
# 不受