团队协作中统一Git换行符LF和CRLF

537 阅读2分钟

windows环境中,当你在 Git 中切换分支或者拉取代码时,换行符从 LF (Line Feed) 变成了 CRLF (Carriage Return + Line Feed)。导致eslint的linebreak-style规则提示异常。

问题原因

Git 有一个名为 core.autocrlf 的配置项,它控制着 Git 如何处理换行符:

  • true: 在检出文件时将 LF 转换为 CRLF,在提交时将 CRLF 转换为 LF
  • input: 在提交时将 CRLF 转换为 LF,但不转换检出文件
  • false: 不进行任何转换

mac上默认false,windows上默认true。

解决方案

1. 设置全局 Git 配置(不推荐)

git config --global core.autocrlf false

这种方式需要全局配置,协同开发时,每个人都需要进行配置。

2. 使用 .gitattributes 文件(推荐)

在项目根目录创建或编辑 .gitattributes 文件,明确指定换行符处理方式:

# 对所有文件使用 LF 换行符
* text=auto eol=lf

# 或者对特定文件类型指定
*.sh text eol=lf
*.bat text eol=crlf

这行配置在 .gitattributes 文件中控制 Git 如何处理文本文件和换行符,具体作用如下:

分解说明

  1. * - 匹配所有文件
  2. text=auto - 让 Git 自动检测文件是否为文本文件
  3. eol=lf - 指定检出时使用 LF (Unix 风格) 换行符

详细作用

  1. text=auto 部分
  • Git 会尝试自动判断文件是文本文件还是二进制文件
  • 对于被识别为文本的文件,Git 会进行换行符转换
  • 二进制文件会被排除在转换之外,防止损坏
  1. eol=lf 部分
  • 提交到仓库时:无论原始换行符是什么,统一转换为 LF
  • 检出文件时:在 Windows 系统上保持为 LF (不转换为 CRLF)
  • 确保仓库内始终保持 LF 换行符,实现跨平台一致性
  1. core.autocrlf 的关系
  • 这个设置会覆盖 core.autocrlf 的全局配置
  • core.autocrlf=true/input/false 的优先级更高
  • 更适合团队项目,因为配置随仓库一起共享

3. 使用 .editorconfig 统一配置

创建或编辑 .editorconfig 文件:

# https://editorconfig.org

root = true

[*]
charset = utf-8
indent_style = space
indent_size = 2
end_of_line = lf
insert_final_newline = true
trim_trailing_whitespace = true

[*.md]
insert_final_newline = false
trim_trailing_whitespace = false

vscode中安装EditorConfig插件

4. 修复已损坏的换行符

如果文件已经被错误转换,可以尝试:

# 删除所有文件并重新检出
git rm --cached -r .
git reset --hard

总结

  1. 团队项目应该统一换行符处理方式
  2. 使用.editorconfig+.gitattributes进行配置
  3. 修改配置后可能需要重新克隆仓库才能完全生效