discard-changes 是 composer 的冲突策略而非开关,控制发现 vendor 未提交修改时是直接丢弃重装(默认)还是报错中止;它只接受 false 值用于禁用自动丢弃,且仅支持项目级配置,无法设为 true。

discard-changes 是什么,为什么不能设成 true
discard-changes 不是开关,而是“冲突策略”:它控制 Composer 发现 vendor/ 下有未提交修改时,是直接删掉重装(默认行为),还是停下来报错。很多人想设成 true 来“自动覆盖”,但 Composer 没有 discard-changes: true 这种配置——它只接受 false,且仅作为命令行临时选项在 install 和 update 中生效,无法全局或永久启用“无脑覆盖”。
- 默认行为(等效于
discard-changes: true的效果)是隐式的:不报错、不提示、直接删包重装 - 你无法用配置让它“更激进”,比如覆盖非 Git 管理的修改、或跳过确认强制写入
- 所谓“设为 true”是个常见误解,实际只是没显式禁用,默认就执行丢弃
怎么真正关掉自动丢弃(推荐做法)
把 discard-changes 设为 false,让 Composer 在检测到修改时立刻中止并报错,给你人工干预的机会。这是防止 CI 覆盖补丁、本地调试被清空的最有效防线。
围绕关键发现、作用机制、临床相关性及研究局限性展开讨论。适用于撰写或优化任何生物医学论文的“讨论(Discussion)”部分——包括结果解读、与既往文献关联、阐释意外发现、界定研究局限性,以及撰写结论。当用户输入以下任一指令时也会自动触发该功能: - “write my discussion” - “help me discuss my findings” - “how do I compare to prior studies” - “write the limitations par
- 项目级设置(推荐):
composer config discard-changes false
—— 会写入当前项目的composer.json的config段 - 手动加也行,在
composer.json里补上:"config": { "discard-changes": false } - 该配置对
composer install、composer update、composer require、composer remove全部生效 - 注意:
composer config -g discard-changes false无效,全局配置会被忽略
设了 false 之后会发生什么
不是“保留修改继续装”,而是“发现修改就停住”。典型错误信息是:Changed files in vendor/package-name will be discarded. Use --force to overwrite.
- 这时你有三个选择:
--force强制覆盖(慎用)、手动清理vendor/下的改动、或改用path仓库 /patches插件长期管理定制逻辑 - 如果包是
dev-main或用了repositories.type: path,此检查自动跳过——Composer 认为你本就在主动维护它 - CI 中务必开启,否则缓存的
vendor可能含临时 patch,install一跑就无声丢失
比 discard-changes 更靠谱的长期方案
discard-changes: false 是兜底锁,不是保险箱。它拦得住误操作,但不会帮你保存、版本化或复现修改。
- 临时改 vendor 文件?别碰。下次
install就消失,且无法审计 - 真要改第三方代码:用
composer config repositories.myfork type path指向本地 fork 目录,把修改放在自己 Git 里 - 或用
composer-patches插件 +extra.patches声明补丁文件,可提交、可测试、可随环境复现 -
discard-changes: false不会告诉你哪行该进 Git,也不会自动清理残留——边界得你自己划清楚










