Git 关于 CRLF 的提示--Warning: in the working copy of CRLF will be replaced by LF the next time Git touches it.
这段时间一直在更新自己的博客, 碰到三个很困扰的问题:
git add
命令执行后总有 Warning 提示:Warning: in the working copy of CRLF will be replaced by LF the next time Git touches it.
git clone
一个新的repo
会直接显示文件modified
, 明明什么都没有改动.- 提交本地的 pdf 文件到仓库之后莫名损坏, pdf 文件上出现大块的黑斑.
后来发现这 3 个问题其实都是一个问题导致的: CRLF
符号. 网上搜索有很多人也遇到同样的问题, 都说要更改 Git 的配置, 但是没有人把原理说得很明白, 今天写文档记录一下.
造成问题的原因
这是 Windows 和 Linux 两个操作系统使用的文档换行符不统一导致的问题.
CR
:\r
LF
:\n
Dos 和 Windows 系统使用的是 回车(CR) 加 换行(LF), 即按下 Enter 键插入了 CR
和 LF
两个字符. Mac 和 Linux 系统只使用 LF
符号. 这导致跨平台开发的时候会出现这两个符号的转换.
Git 默认是与 Linux 对齐的, 而我使用的是 Windows 开发, 故而导致了一系列的问题.
解决办法
很明显, 解决问题的关键就在于 统一 CR 和 LF 这两个字符的使用. 当我们统一了换行符的使用后, 如果还出现 pdf 文件损坏的情况那是因为 Git 将 pdf 文件也当作一般文件进行了换行符的处理, 我们只需要将 pdf 文件指定为二进制文件即可.
解决步骤主要分为三个部分, 但是三个部分不一定全部都需要操作, 你需要根据自己的情况来决定.
配置 Git 换行符转换策略
Git 配置中有一个 core.autocrlf
的配置, 有三种取值: true
, false
, input
.
core.autocrlf
配置
core.autocrlf = true
在git add
时自动将CR + LF
转换成LF
. 在git checkout
时自动将LF
转换为CR + LF
.适用于 Windows 系统上进行开发.
配置命令:
git config --local core.autocrlf true
core.autocrlf = false
不论在什么情况下, 都不进行CR + LF
和LF
的转换.适用于在 Linux 系统上进行开发.
配置命令:
git config --local core.autocrlf false
core.autocrlf = input
仅仅在git add
的情况下将CR + LF
转换成LF
.适用于在 Linux 系统上开发. 如果开发时会不小心加入
CR + LF
, 这样配置可以让 Git 自动检测并转换.配置命令:
git config --local core.autocrlf input
我比较推荐无论在 Windows 还是在 Linux 上开发都使用 LF
, 毕竟 Git 本身使用的是 LF
字符.
更改已有的换行符
如果你已经写了很多代码和文档, 这个时候想统一所有的换行符该怎么办?
通常情况下我们的编辑器是支持搜索和批量更改的.
我使用的是 VSCode .
- 打开搜索功能:
Ctrl + Shift + F
. - 设置搜索条件: 打开搜索框旁边的 「.*」按钮进行正则搜索, 输入
\r\n
. - 点击
Replace All
将其全部转换为\n
.
我们也可以在自己的 IDEA 中设置默认的换行符为 LF
以保证后续新建的文件的换行符是正确的.
还是以 VSCode 为例:
- 打开
首选项
. - 打开
设置
- 在搜索框中输入
EOL
(End Of Line) - 将其设置为
LF
将 pdf 文件指定为二进制文件
一般情况下 Git 是能够自己将 pdf 文件排除 CRLF 符号转换外的. 但是也不排除会将 pdf 也进行转换的操作, 这会导致 pdf 文件的损坏.
我们可以通过强制指定来避免这个问题.
- 找到工程根目录下的
.gitattributes
文件. 如果没有则新建一个. - 添加一行内容并保存.
*.pdf binary
我们可以通过 .gitattributes
文件来强制指定 .pdf
后缀的所有文件按照二进制文件处理. 事实上这适用于很多文件格式:
*.png binary
*.jpg binary
*.jpeg binary
*.ico binary
*.tff binary
*.woff binary
*.woff2 binary
*.pdf binary
总结
Git 默认使用 LF
作为换行符, 而我是用的 Windows 系统默认使用 CRLF
. 不同系统的换行符的不统一导致了 Warning 和一系列的文件修改状态不正确和损坏.
我们可以通过一下多种方法解决这个问题
- 设置 Git
core.autocrlf
- 设置本地 IDEA 的 EOL
- 全局替换 CRLF 符号
- 强制指定 pdf 文件在 Git 中当作二进制文件处理