composer status仅识别以source模式安装且含.git目录的包的本地Git工作区变更,不检测dist包、无Git仓库的包或非包文件修改;需通过--prefer-source重装才能生效。

composer status 显示哪些修改会被识别
composer status 只检查 vendor/ 目录下已安装包的文件是否被本地修改过,且仅对比 Git 仓库的 HEAD(或当前检出分支)与工作区状态。它不扫描未通过 Composer 安装的文件,也不关心 composer.json 或 composer.lock 的变更。
常见误判场景:
- 包含 .git 子目录但未初始化(比如用 package 类型手动放进去的包),status 会跳过,不报任何提示
- 使用 path repository 的本地包,只要其根目录有 Git 且有未提交更改,就会被列出
- 修改了 vendor/autoload.php 或其他非包源码文件?不会显示——这些不属于任何包的 Git 工作区
为什么 status 不显示某些你认为“明显改过”的包
根本原因在于 composer status 依赖每个 vendor 包自身的 Git 状态,而不是比对 composer.lock 或原始发布 ZIP。如果一个包是通过 ZIP 安装(如 dist 模式启用且无 Git 信息),或者 vendor/{name} 目录下根本没有 .git,命令就完全无视它。
可快速验证:
- 进入某个疑似被改但没出现在 status 输出的包目录,执行 git status —— 如果报错 “not a git repository”,那 composer status 就不会管它
- 检查该包在 composer.lock 中的 source 字段:若为 "type": "git" 且含 "url" 和 "reference",才可能被纳入扫描
- composer install --prefer-source 能强制拉取 Git 仓库(带 .git),这是让 status 生效的前提之一
如何让 status 扫得更全、更准
不是所有包默认带 Git 元数据,想让 composer status 发挥作用,得从安装阶段控制:
围绕关键发现、作用机制、临床相关性及研究局限性展开讨论。适用于撰写或优化任何生物医学论文的“讨论(Discussion)”部分——包括结果解读、与既往文献关联、阐释意外发现、界定研究局限性,以及撰写结论。当用户输入以下任一指令时也会自动触发该功能: - “write my discussion” - “help me discuss my findings” - “how do I compare to prior studies” - “write the limitations par
- 全局启用源码模式:
composer config --global prefer-source true,后续所有install/update都优先克隆 Git - 单个项目强制源码:
composer install --prefer-source或设置"config": {"prefer-source": true}到composer.json - 避免混用:
composer update foo/bar --prefer-dist会导致该包无.git,即使其他包有,status也只报它漏掉的部分 - 清理干扰:
rm -rf vendor && composer install比composer update更可靠——后者可能复用旧的 dist 缓存,跳过重新拉源码
status 输出里 “modified” 后面的路径为什么总不一致
composer status 显示的修改路径是相对于该包自身 Git 仓库根目录的,不是相对于项目根目录。所以你会看到类似:
symfony/console: modified
src/Command/Command.php
CHANGELOG.md这说明你在 vendor/symfony/console/ 下改了这两个文件,但路径不带 vendor/symfony/console/ 前缀。这个设计方便你直接进包目录后复制粘贴路径做 git diff 或 git checkout。
注意两个坑:
- 如果包用了子模块或 Git worktree,status 可能漏报或报错,此时应直接进目录跑 git status
- Windows 用户看到反斜杠 \ 路径?那是 PHP scandir 层的遗留行为,不影响功能,但别直接复制去 Linux 下用
真正要定位改动,最稳的方式永远是:先看 composer status 列出的包名,再 cd vendor/{name},再 git status —— 不依赖它自动补全路径,也不信它的缩略提示。

















