警告“CRLF will be replaced by LF”表明Git在暂存区将Windows换行符转为Unix格式,非错误但会引发diff失真、CI失败等问题;根本解法是优先通过.gitattributes按文件类型精细化配置eol规则,并执行git add --renormalize生效。

警告不是错误,但放任不管会导致 diff 失真、CI 失败、脚本执行出错——关键在配置优先级和文件类型粒度控制,而不是盲目改 core.autocrlf。
为什么 git add 会报 “CRLF will be replaced by LF”
这不是 Git 拒绝你提交,而是它在工作区读取文件时发现换行符是 CRLF(常见于 Windows 编辑器保存),但当前配置或仓库规则要求存为 LF。Git 正在暂存区做转换,同时提醒你:磁盘上还是 CRLF,仓库里将变成 LF。
常见诱因包括:
- 你在 macOS/Linux 上用 VS Code、Sublime 或 Notepad++ 打开并保存了别人在 Windows 上写的文件,编辑器默认用了
CRLF - 全局设了
core.autocrlf true,但项目根目录有.gitattributes且写了* text=auto eol=lf,实际以.gitattributes为准 - 刚 clone 一个老仓库,里面已有大量
LF文件,而你本地编辑器持续输出CRLF,每次git add都触发转换提示
core.autocrlf 三个值到底该选哪个
别看选项少,选错就等于给协作埋雷。它的行为不只看操作系统,更要看你的交付环境和团队构成:
-
true:仅适合纯 Windows 开发 + Windows 构建服务器。检出时转CRLF,提交时转LF。但若仓库已混入大量LF脚本(如.sh),首次拉取可能批量告警甚至破坏执行权限 -
input:Linux/macOS 开发者、CI 服务器为 Linux 的标准选择。提交时CRLF → LF,检出时不转换——工作区永远保持LF。这是多数现代项目的事实标准 -
false:禁用所有自动转换。只适用于已全量统一为LF的成熟项目,或含大量二进制/脚本混合文件的仓库(如嵌入式固件工程)。否则极易引入不可控CRLF
执行后务必验证:git config --global core.autocrlf 输出应是你设的值,不能是空或 unset。
为什么配了 input 还有警告
因为 core.autocrlf 是兜底策略,.gitattributes 才是真正起效的规则表。只要项目根目录存在 .gitattributes,它的规则就覆盖全局配置。
OpenClaw 技能 — 给定一个 GitHub 仓库 URL,自动解析出 owner/repo 名称,发现其中的 YAML/properties 配置文件及其配对的中文字段说明;在 `workspace/{repo}/` 目录下按同步日期(格式为 `YYYY-MM-DD`)创建时间戳子目录;写入 `.openclaw-config-state.json` 状态文件。每次用户提问前,先比对远程仓库当前 ref(如 `main` 或 `master`)的最新提交 SHA 与本地状态文件中记录的 SHA:
典型冲突场景:
-
.gitattributes里写了* text=auto,但没指定eol,Git 会按文件内容“猜”类型,有时把.sh当成二进制跳过转换,导致后续 CI 报^M错误 - 你手动用记事本另存过某个
.py文件,换行符变CRLF,而git status显示“modified”,git diff却为空——这是换行符被当作内容变更了 -
.gitattributes漏掉了关键扩展名,比如没写*.yml eol=lf,YAML 文件仍可能被误判
临时修复可用:git add --renormalize . 强制重走归一化流程;但长期解法是补全 .gitattributes 并确保编辑器默认保存为 LF。
推荐的最小可行 .gitattributes 配置
比起依赖系统级配置,直接在项目里声明更可靠。以下内容放进项目根目录的 .gitattributes 文件即可生效:
* text=auto eol=lf *.sh text eol=lf *.py text eol=lf *.js text eol=lf *.json text eol=lf *.yml text eol=lf *.md text eol=lf *.bat text eol=crlf *.exe binary *.png binary *.zip binary
注意三点:
-
text=auto后必须跟eol=lf,否则 Git 可能对某些文件不做标准化 - Windows 批处理文件(
.bat)要显式标eol=crlf,否则 Linux 下无法执行 - 所有二进制文件必须用
binary标记,否则 Git 可能误转导致损坏(比如 PNG 文件里塞进\r就打不开)
最后提醒:改完 .gitattributes 后,必须运行 git add --renormalize . 才能让现有文件按新规则重新归一化。这步漏掉,前面全白配。

















