discard-changes 只接受 false 或不设置,设为 true 无效;设为 false 可使 Composer 在检测到 vendor 修改时中止并报错,防止自动丢弃,推荐在项目级配置以保障 CI 和本地调试安全。

Composer 没有 discard-changes: true 这种配置项,也不支持全局或永久“自动丢弃”;所谓“设为 true”是误解,实际只有 false 是有效可设的值,且只用于禁用默认丢弃行为。
为什么 discard-changes 不能设成 true
discard-changes 不是开关,而是冲突策略标识:它不控制“要不要丢”,而控制“发现修改时停不停”。默认行为(等效于“丢弃”)是隐式执行的——没配 false,就直接删 vendor 包重装,不提示、不确认、不记录。
-
composer config discard-changes true会静默失败,配置不会写入composer.json -
"config": {"discard-changes": true}在composer.json中会被忽略,启动时直接跳过 - 官方文档和源码均未定义
true为合法值,仅接受false或完全不设(即走默认丢弃) - 所谓“自动丢弃”其实是“无防护重装”,不是你主动启用的功能,而是你没关掉它的结果
怎么真正禁用自动丢弃(推荐做法)
把 discard-changes 设为 false,让 Composer 在检测到 vendor 修改时立刻中止并报错,给你干预窗口。这是防止 CI 覆盖补丁、本地调试被清空的最可靠方式。
- 项目级生效(推荐):
composer config discard-changes false,会写入当前项目的composer.json的config段 - 手动编辑也行:在
composer.json的config对象里加"discard-changes": false -
composer config -g discard-changes false无效——全局配置对discard-changes完全不生效 - 该设置对
composer install、composer update、composer require、composer remove全部起作用
设了 false 之后会看到什么错误
命令不再静默覆盖,而是卡住并抛出明确提示:
工作流任务拆解与模型编排技能。使用场景:(1) 收到复杂工作任务需要拆解为可执行步骤,(2) 需要为不同步骤选择最合适的模型,(3) 需要跟踪工作流进度和模型使用情况,(4) 长时间任务卡住需要问题诊断和解决方案。
Changed files in vendor/package-name will be discarded. Use --force to overwrite.
这时你有三个实际选择:
-
composer install --force:强制丢弃所有修改(慎用,尤其在 CI 中) - 手动进
vendor/package-name,用git stash或复制备份后再重试 - 改用
repositories.type: path把包指向本地目录,把修改纳入自己 Git 管理(长期方案)
注意:如果包是 dev-main 或已配置 path 类型仓库,此检查自动跳过——Composer 认为你本就在主动维护它。
比 discard-changes: false 更靠谱的长期方案
discard-changes: false 是防误操作的锁,不是保存修改的保险箱。它拦得住 install,但不会帮你版本化、复现或审计改动。
- 临时改
vendor/文件?别碰。下次install就消失,且无法追溯 - 真要改第三方逻辑:用
composer config repositories.myfork type path指向本地 fork 目录,把所有改动放在自己 Git 里管理 - CI 中务必开启
discard-changes: false,否则缓存的vendor可能含临时 patch,install一跑就无声丢失
复杂点在于:这个配置不解决“如何保存修改”,只解决“别让我稀里糊涂丢掉”。真正的保存,得靠你自己的仓库结构和流程设计。

















