discard-changes 与自动暂存无关,仅控制 vendor/ 目录未提交修改的丢弃行为,不保护项目源码;stash_composer 是第三方脚本,非 composer 内置功能。

composer install/update 时自动 stash 本地修改,不是靠 discard-changes
直接说结论:discard-changes 和「自动暂存」完全无关——它只控制是否丢弃 vendor/ 里已有的、未提交的修改,**不碰你的项目源码**。想保护 src/ 或 config/ 下的本地改动,得靠 Git 自己的机制,不是 Composer 配置能解决的。
stash\_composer 是第三方脚本,不是 Composer 内置功能
stash_composer 是社区写的 Bash/Python 小工具(比如 git stash push -m "pre-composer" + composer install + git stash pop 的封装),Composer 本身根本不认识这个命令。如果你运行 stash_composer 报错「command not found」,说明它根本没装或没加进 $PATH。
- 确认是否真有这个命令:
which stash_composer或ls /usr/local/bin/stash_composer - 常见替代做法是写个简单 wrapper 脚本,比如
./bin/composer-safe,内容就是三行 Git + Composer 命令 - 别把它当成 Composer 的子命令——
composer stash_composer这种写法永远不合法
为什么不能用 discard-changes 实现“保护”
discard-changes 只在 composer install 或 composer update 期间起作用,且仅针对 vendor/ 目录下的包代码。它的行为是:如果某个包目录里有未提交的修改,就直接 git checkout -- .(或 rm -rf 后重拉),**不会保存、不会 stash、不会提醒你**。
- 设成
true:静默丢弃vendor/修改 → 适合 CI,但对开发者等于“悄悄删你改的包代码” - 设成
false(默认):遇到vendor/修改就报错退出,强制你先处理 → 安全但打断流程 - 它对你的
app/、routes/web.php等项目文件完全无感
真正靠谱的本地修改保护方案
Git 是唯一可靠的防线。Composer 不该、也不能替你管理项目源码状态。推荐组合:
- 把临时调试修改加到
.gitignore(比如config/local.php),避免误提交 - 敏感配置用
phpdotenv+.env.local,并确保.env.local在.gitignore里 - 需要临时改 vendor 包?用
composer patch(配合cweagans/composer-patches)或 fork +repositories替换,而不是直接编辑vendor/ - 非要用 stash:写个 alias,比如
alias ci='git stash push -m "pre-composer" && composer install && git stash pop',但注意pop可能冲突,得手动解决
最常被忽略的一点:很多人以为 discard-changes=true 能“保护自己改的代码”,其实它只让 Composer 更粗暴地清理 vendor/ ——而你真正要保护的 app/ 文件,它连看都不会看一眼。










