最稳妥解法是统一用LF存储、禁用core.autocrlf、靠.gitattributes精准控制:根目录配.text=auto和.eol=lf,标记二进制文件为binary,并设core.autocrlf false、safecrlf true。
macos 上 git 换行符冲突,本质不是文件真被改了,而是 git 把 lf 和 crlf 当成内容差异处理了。最稳妥的做法是统一用 lf 存储、禁用自动转换、靠 .gitattributes 精准控制。
优先配好 .gitattributes 文件
在项目根目录创建或编辑 .gitattributes,明确告诉 Git 哪些是文本、哪些必须用 LF:
-
* text=auto—— 让 Git 自动识别文本/二进制,避免误转图片、压缩包 -
* text eol=lf—— 所有文本文件强制存为 LF(推荐,仓库统一) -
*.{md,markdown,txt,js,ts,py,sh,html,css,json,yml,yaml} text eol=lf—— 针对常用源码和配置文件单独声明更稳妥 -
*.{png,jpg,gif,zip,pdf,exe} binary—— 明确标记二进制,彻底关闭换行处理
全局关掉 autocrlf,避免干扰
macOS 默认是 input,但容易和项目规则冲突。直接设为 false 更干净:
git config --global core.autocrlf false-
git config --global core.safecrlf true—— 提交时若检测到混合换行符,Git 会拒绝,帮你提前发现编辑器问题 -
git config --global core.whitespace trailing-space,cr-at-eol—— 同时检查空格和回车符,减少隐性污染
修复已错乱的仓库状态
如果已经出现“一堆 modified 却 diff 不出变化”,说明缓存和工作区换行不一致。按顺序执行:
- 先提交或暂存当前真实修改(别丢代码)
-
git rm --cached -r .—— 清空 Git 缓存,不碰工作区文件 -
git reset --hard—— 重置工作区,让文件按新.gitattributes规则重新检出 -
git add .—— 重新添加,这次会按 LF 归一化 git commit -m "normalize line endings"
顺手调下编辑器和终端习惯
Git 规则再准,编辑器乱保存也会反复触发问题:
- VS Code:设置
"files.eol": "\n",关掉“自动检测换行符” - 终端查看验证:
file -b your_file.md应显示with CRLF line terminators或with LF line terminators;或者用xxd your_file.md | head看末尾字节是0a(LF)还是0d 0a(CRLF) - Obsidian / Typora 等笔记工具:确认设置里默认换行符为 LF,不随系统变


















