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 中当作二进制文件处理。