如果 Git 突然在你的 Mac 上将几乎所有文件都标记为已修改,换行符转换可能会使工作副本与 Git 跟踪的版本产生差异。在更改或恢复文件之前,请先检查仓库。然后使用适合 macOS 的 Git 设置,并且仅在保护好所有实际编辑内容后再重新规范化。Git 建议使用 LF 换行符存储文本;其针对 macOS 的指南使用的是 core.autocrlf input。GitHub 的换行符处理指南
为什么换行符会导致每个文件都显示为已更改?
换行符用于标记每行的结尾:Unix 风格的 LF 使用一个字符,而 Windows 风格的 CRLF 使用一个回车符加一个换行符。如果 Git 或编辑器更改了整个工作副本中的换行符,即使文本本身看起来相同,Git 也可能会报告大量文件更改。Git 可以在其索引中将文本规范化为 LF,并在检出文件时根据配置和 .gitattributes 应用不同的换行符。Git 的 gitattributes 文档
在修复之前先检查仓库
打开终端,进入仓库目录,检查其状态和换行符设置:
git status --short
git config --show-origin --get core.autocrlf
git ls-files --eol
如果未设置任何值,config 命令可能不会输出任何内容。--show-origin 有助于识别是哪个配置文件提供了该设置。在 git ls-files --eol 中,比较索引 (i/) 和工作区 (w/) 的换行符;mixed 表示混合换行符。attr/ 值显示适用的属性。Git 将此输出作为索引、工作区和换行符属性的诊断信息进行记录。Git 的 git-ls-files 文档
在继续操作之前,还需检查是否存在实际的修改。如果发现了需要保留的更改,请提交它们或将它们复制到安全的地方。不要使用一揽子还原(restore)或重置(reset)来作为换行符的修复方案:这些命令可能会丢弃你的工作成果。二进制文件需要特别小心,因为如果 Git 将它们误当成文本处理,换行符转换可能会损坏数据。Git 的 git-config 文档
为 macOS 设置合理的默认值
对于你在各仓库中使用的 Git,设置文档建议的 macOS 偏好配置:
git config --global core.autocrlf input
设置为 input 时,Git 会在添加文本时将 CRLF 规范化为 LF,但在检出时不会将 LF 文件转换为 CRLF。此设置并不能决定每个文件的策略:仓库属性可以按文件类型指定行为,而 Git 的 text 和 eol 属性控制规范化和检出时的换行符。GitHub 的平台特定指南 和 Git 配置参考
如果问题仅限于单个项目,请优先使用该项目的 .gitattributes 策略,而不是为了适应一个仓库而更改你的全局配置。一个常见的起点是 * text=auto;特定格式可以固定为 LF 或 CRLF,而二进制格式应标记为 binary。例如,Shell 脚本通常需要 LF,而某些 Windows 项目文件需要 CRLF。正确的模式取决于仓库的工具和协作者。Git 的 gitattributes 示例
* text=auto
*.sh text eol=lf
*.bat text eol=crlf
*.png binary
仅在审查更改后进行重新规范化
更改配置或属性并不能保证现有文件立即可用且保持一致。GitHub 文档中记录的刷新流程是:先保存或提交未完成的工作,然后运行 git add --renormalize . 并审查生成的状态。GitHub 的刷新说明
在你安全保存了编辑内容并确定了仓库策略后,暂存规范化更改并仔细检查 Git 提议的具体内容:
git add --renormalize .
git status --short
git diff --cached --stat
git diff --cached
不要自动提交。仔细审查暂存的差异(diff),尤其是意外出现的二进制文件或生成文件。如果它仍然显示了非预期的内容更改,请停下来,使用 git ls-files --eol 检查受影响的路径及其 attr/ 值;在重新暂存之前纠正属性策略。如果仓库先前存储的换行符不一致,重新规范化可能会产生大量合理的差异,因此在必要时请与协作者协调规范化提交。
如果文件仍显示为已修改
换行符只是可能的原因之一。在已暂存或未暂存的差异中寻找实质性的内容不同,检查是否有编辑器重写了文件,并检查特定于文件的过滤器或属性。如果 git ls-files --eol 报告 i/lf 和 w/crlf,请确认是否有属性或设置刻意要求了 CRLF。如果报告 mixed,在规范化之前先确定哪些文件具有混合换行符以及它们是否为文本。Git 的安全检查可以针对不可逆的转换发出警告,但它们无法判断文件是否被错误地归类为文本。Git 配置参考
实用的处理顺序是:保护编辑内容,检查 core.autocrlf 和 git ls-files --eol,选择一致的项目策略,然后重新规范化并审查差异。这样既能解决换行符带来的干扰,又能让你掌控所有实际的内容更改。
来源
配置 Git 处理换行符 — GitHub 文档
Git - gitattributes 文档 — Git
Git - git-config 文档 — Git
Git - git-ls-files 文档 — Git