windows环境中,当你在 Git 中切换分支或者拉取代码时,换行符从 LF (Line Feed) 变成了 CRLF (Carriage Return + Line Feed)。导致eslint的linebreak-style规则提示异常。
问题原因
Git 有一个名为 core.autocrlf 的配置项,它控制着 Git 如何处理换行符:
true: 在检出文件时将 LF 转换为 CRLF,在提交时将 CRLF 转换为 LFinput: 在提交时将 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 如何处理文本文件和换行符,具体作用如下:
分解说明
*- 匹配所有文件text=auto- 让 Git 自动检测文件是否为文本文件eol=lf- 指定检出时使用 LF (Unix 风格) 换行符
详细作用
text=auto部分
- Git 会尝试自动判断文件是文本文件还是二进制文件
- 对于被识别为文本的文件,Git 会进行换行符转换
- 二进制文件会被排除在转换之外,防止损坏
eol=lf部分
- 提交到仓库时:无论原始换行符是什么,统一转换为 LF
- 检出文件时:在 Windows 系统上保持为 LF (不转换为 CRLF)
- 确保仓库内始终保持 LF 换行符,实现跨平台一致性
- 与
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
总结
- 团队项目应该统一换行符处理方式
- 使用
.editorconfig+.gitattributes进行配置 - 修改配置后可能需要重新克隆仓库才能完全生效