跨平台协作换行符问题

16 阅读4分钟

目前的业界最佳实践是 强制全平台(包括 Windows)都使用 LF。因为现代编辑器(VS Code)和构建工具(Vite, Webpack)在 Windows 上都能完美处理 LF,而 Linux/Mac 服务器(部署环境)通常不兼容 CRLF。

以下是分层级的彻底解决方案


第一层:Git 层面(最重要)

Git 是导致此问题的源头。默认情况下,Windows 上的 Git 会开启 autocrlf,导致提交时自动转换。我们需要通过项目配置文件覆盖用户个人的全局设置。

操作步骤: 在项目根目录新建或编辑 .gitattributes 文件(如果不存在则新建),添加以下内容:

Properties

# .gitattributes

# 强制所有开发者(无论 Windows 还是 Mac)
# 提交代码时转换为 LF,检出代码时也保持 LF
* text=auto eol=lf
  • 作用: 这告诉 Git,不管你是谁,不管你的电脑怎么设置,这个项目里的文件必须全是 LF 换行符。这样能保证 Git 仓库里的代码永远是干净的 LF

第二层:编辑器规范层面 (.editorconfig)

VS Code 会读取 .editorconfig 文件来决定新建文件时使用什么换行符。这能保证新写的代码默认就是正确的。

操作步骤: 在项目根目录新建或编辑 .editorconfig 文件:

Ini, TOML

# .editorconfig
root = true

[*]
charset = utf-8
indent_style = space
indent_size = 2
# 核心设置:强制使用 lf
end_of_line = lf
insert_final_newline = true
trim_trailing_whitespace = true
  • 作用: 当你在 VS Code 中新建文件或按 Ctrl+S 保存时,VS Code 会自动把换行符设为 LF,右下角显示的 CRLF 会自动变成 LF

第三层:代码格式化工具 (Prettier)

如果你项目中使用了 Prettier,它非常严格。如果换行符不对,它会直接报错或标红。

操作步骤:.prettierrc (或 .prettierrc.json / prettier.config.js) 中明确配置:

JSON

{
  "endOfLine": "lf"
}
  • 作用: 当你格式化代码(Format on Save)时,Prettier 会强制把所有 CRLF 替换为 LF

第四层:解决 VS Code 右下角的显示

如果你做了以上三步,VS Code 右下角应该默认显示为 LF。如果偶尔显示 CRLF,点击右下角的 CRLF 文字,选择 LF 即可转换当前文件。

为了防止 VS Code 自动推断错误,可以在 VS Code 的 settings.json(工作区设置 .vscode/settings.json)中添加:

JSON

{
  "files.eol": "\n"
}

🚨 紧急补救:如何修复项目中现存的混乱文件?

配置好上面这些文件后,原本已经是 CRLF 的旧文件不会自动变回来,Git 可能会提示大量变更。你需要执行一次"洗澡"操作:

  1. 确保工作区干净(所有代码已 commit并push)。
  2. 配置好上面的 .gitattributes
  3. 执行 Git 重整命令(在终端运行):

Bash

# 1. 删除 Git 的索引(不会删除文件,只是清除 Git 缓存)
git rm --cached -r .

# 2. 重新扫描文件(这时 Git 会根据 .gitattributes 里的 eol=lf 重新识别)
git reset --hard //没有push的代码会丢失,要注意先提交代码

或者,如果你配置了 Prettier,直接运行一次全量格式化:

Bash

# 例如
npx prettier --write .

最后:控制台的提示

上面的步骤都完成之后,在修改代码并 git add .
会提示 LF will be replaced by CRLF the next time Git touches it

1. 警告的真实含义

我检测到你正在提交的文件全是 LF但是,我(Git)的 Windows 全局设置告诉我‘检出文件时必须转换成 CRLF’。所以,虽然现在仓库里存的是 LF,但下次你在 Windows 上检出(Checkout)这个文件时,我会自作主张把它变回 CRLF。

简单来说
  • 你的文件现状:已经是 lf 了(因为你用editConfig或Prettier修复了)。
  • Git的困惑:Git 的Windows默认设置(core.autocrlf = true)还在试图把文件变成crlf,它觉得两者不一致,所以会发出这个警告

2. 为什么会出现这个问题

Git 在windows上全局配置的是crlf, 但是只要项目中有 .gitattributes 文件且内容写了eol=lf,就可以完全忽略这个警告,因为 .gitattributes 的优先级是最高的,最终检出的文件会保持 lf

3. 如何消除

在终端执行

git config --global core.autocrlf input
  • true (windows 默认):提交时转lf, 检出时转 crlf。(这就是导致警告的原因)。
  • input(推荐):提交时转lf, 检出时不转换(保持仓库里的lf)。
  • false:啥都不管(容易乱,不推荐)

设置成 input后,Git 就会明白:"哦,原来你就是想要lf, 那我不转换了。"警告就会消失。
Git读取配置的优先级:

  1. .gitattributes文件(最高)
  2. .git/config(项目级设置)
  3. git config --global(用户级设置)
  4. Git系统默认 如果只是自己一个人用git config --global core.autocrlf input就可以了,但是为了保证项目在团队中的一致性,还是不要删除 .gitattributes文件

总结

  • LF (Line Feed): Mac/Linux 标准,也是 Web 开发标准。
  • CRLF: Windows 标准(Web 开发中的"异类")。

解决方案核心: 通过 .gitattributes 强制 Git 仓库只认 LF,并通过 .editorconfig 让 VS Code 在 Windows 上也假装自己是 Linux,只生成 LF