composer status在windows和linux间总报modified,是因为它对dist包直接比对文件哈希,而换行符(crlf vs lf)差异导致哈希不一致;需用file或git ls-files检查eol,通过.gitattributes统一换行符或切source模式规避。

composer status 为什么在 Windows 和 Linux 之间总报 modified?
因为 composer status 在 -v 模式下对 dist 包(zip/tar 安装)会比对文件哈希,而换行符(\r\n vs \n)会导致哈希不一致——哪怕代码逻辑完全一样。这不是你改了逻辑,是 Git 或解压工具自动转换了行尾,但 Composer 不做 normalize,直接标为 modified。
如何确认是换行符惹的祸,而不是真被篡改?
先用 composer status -v 找出被标记的包,再进对应目录检查典型 PHP 文件的换行符:
- 运行
file vendor/some-vendor/some-package/src/SomeClass.php(Linux/macOS),看输出是否含CRLF - Windows 上可用
git ls-files --eol vendor/some-vendor/some-package/src/SomeClass.php查 eol 状态 - 对比同一文件在 CI(Linux)和本地(Windows)的
sha256sum,若仅因换行不同而哈希不等,基本可锁定问题
怎么让 composer status 忽略换行符差异?
它不能忽略——composer status 没提供 normalize 选项,哈希校验是二进制级的。真正可行的只有两条路:
本文档主要讲述的是Android 操作系统的介绍;Android是基于Linux内核的操作系统,是Google公司在2007年11月5日公布的手机操作系统,早期由Google开发,后由开放手持设备联盟(Open Handset Alliance)开发。它采用了软件堆层(software stack,又名以软件叠层)的架构,主要分为三部分。底层Linux内核只提供基本功能;其他的应用软件则由各公司自行开发,部分程序以Java编写。希望本文档会给有需要的朋友带来帮助;感兴趣的朋友可以过来看看
- 统一换行符:在项目根目录加
.gitattributes,写入* text=auto eol=lf,然后git add --renormalize .强制重写工作区 - 绕过哈希校验:把包切回 source 模式(
composer update --prefer-source vendor/package),这样status只查git status --porcelain,而 Git 默认对文本文件做 eol 自动处理,不再因换行报modified - CI 中避免此问题:用
composer install --no-scripts --prefer-dist+ 预设core.autocrlf=false,防止 Git 干预解压后文件
为什么 vendor/autoload.php 经常被误标 modified?
这个文件本身不参与 composer.lock 的哈希记录,但它是 dist 包解压产物,且常被 IDE 或编辑器自动添加 BOM 或换行符。更麻烦的是:composer status -v 会把它列在 “Untracked files” 里(尤其在 Windows 上),但它其实根本不在任何包的源码中——它是 Composer 自动生成的引导文件。
别信它的状态。验证它是否安全,只做两件事:grep -q "eval\|system\|base64_decode" vendor/autoload.php 和 sha256sum vendor/autoload.php | grep "a1b2c3..."(固定预期哈希)。其他所有 modified 提示,对这个文件都不可信。










