git diff --ignore-cr-at-eol --stat
git add --renormalize .
git commit -m 'normalize line endings'

改了一个字段,git diff 显示 1200 行全删全增。加 --ignore-space-at-eol 一看,真正变的只有第 37 行。文件在 Windows 上是 CRLF,提交进仓库变成了 LF。这类现象通常不是突然出现的,往前翻半天日志能看到苗头。

追下去是这么回事:提交时 core.autocrlf 把 CRLF 转成 LF,检出时又按平台转回去,两边设置不一致就会整文件重写。仓库里没有 .gitattributes 固定行尾,每个人的 Git 配置各管各的。

「行尾整文件改动」确认了原因之后,改动尽量只碰那一处,顺手改的东西后面最容易出问题。同一份配置存在多处的,先确认改的是被加载的那一份。

新版本先放一台机器上跑一天再全量,问题一般在这段时间暴露。备份不是备了就行,恢复一次才算数,很多备份文件打开才发现是空的。

处理上按这个顺序:git diff --ignore-cr-at-eol 确认实际改动范围;在仓库根目录加 .gitattributes 写 * text=auto eol=lf;git add --renormalize . 把已跟踪文件统一规范化;单独提交一次格式化 别和业务改动混在一起;团队成员统一 core.autocrlf 设置。

确认没问题再收工,再改一行时 git diff 只显示那一行 文件行数不变。

作者 9823189