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 :: devicon: vscode]:。
- 打开搜索功能:
Ctrl + Shift + F。 - 设置搜索条件:打开搜索框旁边的 「.*」按钮进行正则搜索,输入
\r\n。 - 点击
Replace All将其全部转换为\n。
我们也可以在自己的 IDEA 中设置默认的换行符为 LF 以保证后续新建的文件的换行符是正确的。
还是以 VSCode :: devicon: 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 中当作二进制文件处理。
贡献者
更新日志
941fa-feat(theme): upgrade and use collections于eb6eb-improve(docs): use pangu formatter于59f2e-improve(theme): upgrade theme and fix the deprecated old icon syntax于af478-improve(docs): use chinese punctuation于fea7c-improve(docs): delete extra whitespace and blank lines于c1c02-modify(docs): remanage folders and rename files于ec3f5-docs: update docs于3d6e6-更改navbar于c0924-整理文章格式于5fe1d-update于