composer status 比对的是 vendor 下包的当前状态与 composer.lock 记录的原始快照(git commit hash 或 dist 文件哈希),仅判断是否被修改,不输出行级差异;它依赖 git 工作区状态(source 模式)或文件内容哈希(dist 模式),不调用外部 diff 工具。

Composer status 命令到底比什么
composer status 并不直接调用外部 diff 工具,它只是扫描 vendor/ 下已安装包的源码目录,检查是否存在「未提交的本地修改」——比如你手动改过 vendor/myvendor/mypackage/src/Helper.php,它就能发现。它底层靠的是 Git(如果包是 Git 克隆来的)或简单文件哈希(如通过 dist 方式安装的 ZIP 包),不是调用 diff、vimdiff 或系统 diff 命令。
为什么有时看到 diff 输出但 status 没反应
常见误解:以为 composer status 会像 git status 那样显示行级差异。实际上它只报「有改动」或「干净」,不输出 diff 内容。如果你看到类似 Files modified: vendor/foo/bar/src/X.php,那是它列出路径;想看具体改了啥,得自己进目录执行:
cd vendor/foo/bar<br>git diff(前提是该包是以 source 方式安装且含 .git)。若包是
dist 安装的(默认行为),composer status 只能靠文件内容比对,且不会告诉你改了哪几行。
如何让 status 显示更准、更快
影响准确性的关键点:
围绕关键发现、作用机制、临床相关性及研究局限性展开讨论。适用于撰写或优化任何生物医学论文的“讨论(Discussion)”部分——包括结果解读、与既往文献关联、阐释意外发现、界定研究局限性,以及撰写结论。当用户输入以下任一指令时也会自动触发该功能: - “write my discussion” - “help me discuss my findings” - “how do I compare to prior studies” - “write the limitations par
-
composer install --prefer-source才会在vendor/留下完整 Git 仓库,status才能复用git status快速判断 - 如果包被
path仓库引用("repositories": [{"type": "path", ...}]),status会跳过检查 —— 它默认认为 path 包是开发态,不纳入「是否被意外修改」的校验范围 - 某些包在
composer.json中声明了"archive": {"exclude": ["*.md"]},但status不关心归档配置,它只看实际文件是否存在差异 - Windows 下注意换行符(CRLF vs LF),可能触发误报;建议项目统一设
core.autocrlf=input
替代方案:真正需要 diff 时怎么做
当你要确认某次 composer update 是否悄悄覆盖了你的 hack,或者想审计第三方包的定制修改,composer status 只是第一道筛子。更可靠的做法是:
- 用
git add vendor/把 vendor 提交进 Git(不推荐,但最直白) - 改用
composer-patches插件,把所有修改写成补丁并声明在composer.json中,这样status不会报错,升级也可持续 - 对关键包单独做 fork + 修改 + packagist 发布,彻底脱离「本地改 vendor」的反模式
真要 diff,别依赖 composer status 的输出格式 —— 它不提供行级差异,也不接受 --diff-tool 这类参数。这是设计使然,不是 bug。










