composer如何防止意外提交vendor目录?(.gitignore最佳实践)

1次阅读

vendor目录不能进git,因为它是composer动态生成的依赖快照而非源码,提交会导致重复存储、合并冲突、拉取变慢及环境不一致;.gitignore需写为/vendor/并确保composer.lock被提交;已误提交时应执行git rm -r –cached vendor撤回追踪。

composer如何防止意外提交vendor目录?(.gitignore最佳实践)

vendor目录为什么不能进Git?

因为vendor是Composer根据composer.jsoncomposer.lock动态生成的依赖快照,不是项目源码。提交它会导致:重复存储、分支合并冲突、拉取变慢、不同环境行为不一致(比如本地PHP版本高,CI用低版本但vendor里混着高版本字节码)。

.gitignore里只写/vendor够吗?

不够。常见漏掉的点:vendor/末尾斜杠必须加,否则可能忽略失败;windows下路径分隔符不影响,但Git只认/;还要排除composer.lock的误删风险——它必须提交,但常被误认为“和vendor一样该忽略”。

  • /vendor/(开头/确保只匹配项目根下的vendor目录)
  • 确认没有写成vendorvendor/*——前者可能匹配到文件名含vendor的文件,后者不递归忽略子目录
  • 检查是否意外写了!vendor/!composer.lock这类反向规则(尤其从模板复制时)

已经误提交了vendor,怎么干净撤回?

关键是「删掉Git追踪但保留本地文件」,否则直接rm -rf vendorgit add会丢掉所有依赖,导致composer install失败。

  • 运行git rm -r --cached vendor--cached是核心,它只从索引移除,不碰磁盘)
  • git commit -m "remove vendor from git tracking"
  • 之后composer install仍能正常工作——因为vendor还在你磁盘上,只是Git不管它了
  • 如果git status还显示vendor/下大量deleted文件,说明没加--cached,得用git checkout -- vendor恢复索引状态再重试

CI/CD里怎么验证vendor没被提交?

靠人工看git diff不可靠。建议在CI脚本里加一行检查:

git ls-files | grep '^vendor/' && (echo "ERROR: vendor found in git" >&2; exit 1) || echo "OK: vendor ignored"

注意:这个检查必须放在composer install之前,否则CI环境里vendor是空的,永远过不了。更稳妥的做法是用git ls-files --cached | grep '^vendor/',只查已追踪的文件。

真正容易被忽略的是:团队里有人改了.gitignore但没同步,或者用ide自动补全时把/vendor写成vendor/(少开头斜杠),这种错误在单人开发时几乎不暴露,一到多人协作就突然冒出一vendor冲突文件。

text=ZqhQzanResources