/vendor必须加开头斜杠以精确匹配根目录下的vendor目录,避免误匹配如myvendor.php等文件;改.gitignore后须执行git rm -r --cached vendor清除缓存,否则仍会追踪;vendor/bin/和composer.phar也需一并忽略;composer.lock是依赖一致性契约,必须提交且与composer.json严格对齐。

vendor 目录必须被 .gitignore 彻底屏蔽
Git 里出现 vendor/ 是配置错误,不是“暂时没忽略”,而是根本没配对。只要它出现在 git status 里,就说明 .gitignore 没生效或已被缓存。
检查项目根目录的 .gitignore 是否包含这一行:
vendor/
注意末尾斜杠——写成 vendor(无斜杠)会意外忽略所有含 vendor 字符串的文件,比如 vendor_foo.php;写成 vendor/* 则可能漏掉 vendor/.git 这类隐藏子目录。
如果已经误提交过:
- 先运行
git rm -r --cached vendor清除 Git 缓存(不删本地文件) - 再
git commit -m "remove vendor from git" - 确认
git status不再列出vendor/下任何内容
想保留某几个二进制工具?别动 vendor,改 bin-dir + bin-compat
有人以为“保留 vendor/bin/phpunit”就得把整个 vendor/ 提交,这是错的。真正要保留的是工具的可执行入口,而它由 Composer 控制生成位置,不是靠 Git 保存文件。
正确做法是:在项目级 composer.json 中配置:
{
"config": {
"bin-dir": "tools",
"bin-compat": "full"
}
}
bin-dir 改路径,bin-compat: full 强制生成包装脚本(而非软链),避免 CI 环境因跨文件系统不支持软链而失败。
Git 提交信息生成器。根据代码变更内容自动生成符合 Conventional Commits 规范的提交信息,包含类型、范围、简短描述、详细说明和关联的 Issue/需求号。触发词:生成提交信息、提交信息、commit message、git commit、生成 commit 信息
然后手动创建目标目录并重装:
-
mkdir -p tools(必须存在,否则composer install静默跳过链接) -
rm -rf vendor(删干净才能让新配置生效) -
composer install --no-dev(只装生产依赖,tools/下只出现你实际需要的二进制)
此时 tools/phpunit、tools/phpcs 就是你要“保留”的东西,它们由 Composer 自动管理,Git 只需跟踪 composer.json 和 composer.lock。
为什么不能直接提交 vendor/bin 下的某个文件
因为 vendor/bin(或你自定义的 tools/)里的文件不是独立存在的——它们是符号链接或包装脚本,指向 vendor/包名/ 内的真实路径。一旦你只提交其中某个文件,Git 就会丢失它背后的依赖关系。
常见后果包括:
-
tools/phpunit被提交,但vendor/phpunit/phpunit/没装(比如composer.lock里没这行),脚本执行时报Class not found - 不同开发者环境 PHP 版本不一致,软链指向的源文件因
declare(strict_types=1)或语法差异直接 fatal error - CI 构建时
composer install跳过 dev 包,但你提交的tools/psysh依赖symfony/console的 dev 版本,运行即崩
所有这些,都源于绕过 Composer 的声明式管理,试图用 Git “固定”一个动态生成的产物。
CI/CD 中确保二进制可用的最小验证步骤
离线环境或构建镜像时,最容易漏掉的是“生成后是否真能跑”。不要只检查 tools/ 目录是否存在文件,要验证执行能力:
- 加一条 shell 检查:
test -x tools/phpunit && tools/phpunit --version - 若用
php前缀调用(推荐),写成:php tools/phpunit --version(规避 Windows 权限和 shebang 失效) - CI 脚本中避免
composer update—— 它会改composer.lock,导致二进制版本漂移;始终用composer install
真正容易被忽略的点是:你改了 bin-dir,但没删 vendor 重装,或者忘了 mkdir -p tools,结果 composer install 成功却静默不生成任何链接——连报错都没有,只有运行时才发现 Command not found。










