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:\rLF:\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 truecore.autocrlf = false不论在什么情况下, 都不进行CR + LF和LF的转换.适用于在 Linux 系统上进行开发.
配置命令:
git config --local core.autocrlf falsecore.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 中当作二进制文件处理.
