Skip to content

Git 关于 CRLF 的提示——Warning: in the working copy of CRLF will be replaced by LF the next time Git touches it.

约 1205 字大约 4 分钟

Git

2024-10-21

这段时间一直在更新自己的博客,碰到三个很困扰的问题:

  1. git add 命令执行后总有 Warning 提示:Warning: in the working copy of CRLF will be replaced by LF the next time Git touches it.
  2. git clone 一个新的 repo 会直接显示文件 modified,明明什么都没有改动。
  3. 提交本地的 pdf 文件到仓库之后莫名损坏,pdf 文件上出现大块的黑斑。

后来发现这 3 个问题其实都是一个问题导致的:CRLF 符号。网上搜索有很多人也遇到同样的问题,都说要更改 Git 的配置,但是没有人把原理说得很明白,今天写文档记录一下。

造成问题的原因

这是 Windows 和 Linux 两个操作系统使用的文档换行符不统一导致的问题。

  • CR\r
  • LF\n

Dos 和 Windows 系统使用的是 回车(CR)加 换行(LF),即按下 Enter 键插入了 CRLF 两个字符。Mac 和 Linux 系统只使用 LF 符号。这导致跨平台开发的时候会出现这两个符号的转换。

Git 默认是与 Linux 对齐的,而我使用的是 Windows 开发,故而导致了一系列的问题。

解决办法

很明显,解决问题的关键就在于 统一 CR 和 LF 这两个字符的使用。当我们统一了换行符的使用后,如果还出现 pdf 文件损坏的情况那是因为 Git 将 pdf 文件也当作一般文件进行了换行符的处理,我们只需要将 pdf 文件指定为二进制文件即可。

解决步骤主要分为三个部分,但是三个部分不一定全部都需要操作,你需要根据自己的情况来决定。

配置 Git 换行符转换策略

Git 配置中有一个 core.autocrlf 的配置,有三种取值:truefalseinput

core.autocrlf 配置

  1. core.autocrlf = truegit add 时自动将 CR + LF 转换成 LF。在 git checkout 时自动将 LF 转换为 CR + LF

    适用于 Windows 系统上进行开发。

    配置命令:

    git config --local core.autocrlf true
  2. core.autocrlf = false 不论在什么情况下,都不进行 CR + LFLF 的转换。

    适用于在 Linux 系统上进行开发。

    配置命令:

    git config --local core.autocrlf false
  3. core.autocrlf = input 仅仅在 git add 的情况下将 CR + LF 转换成 LF

    适用于在 Linux 系统上开发。如果开发时会不小心加入 CR + LF,这样配置可以让 Git 自动检测并转换。

    配置命令:

    git config --local core.autocrlf input

我比较推荐无论在 Windows 还是在 Linux 上开发都使用 LF,毕竟 Git 本身使用的是 LF 字符。

更改已有的换行符

如果你已经写了很多代码和文档,这个时候想统一所有的换行符该怎么办?

通常情况下我们的编辑器是支持搜索和批量更改的。

我使用的是 VSCode

  1. 打开搜索功能:Ctrl + Shift + F
  2. 设置搜索条件:打开搜索框旁边的 「.*」按钮进行正则搜索,输入 \r\n
  3. 点击 Replace All 将其全部转换为 \n

我们也可以在自己的 IDEA 中设置默认的换行符为 LF 以保证后续新建的文件的换行符是正确的。

还是以 VSCode 为例:

  1. 打开 首选项
  2. 打开 设置
  3. 在搜索框中输入 EOL(End Of Line)。
  4. 将其设置为 LF

将 pdf 文件指定为二进制文件

一般情况下 Git 是能够自己将 pdf 文件排除 CRLF 符号转换外的。但是也不排除会将 pdf 也进行转换的操作,这会导致 pdf 文件的损坏。

我们可以通过强制指定来避免这个问题。

  1. 找到工程根目录下的 .gitattributes 文件。如果没有则新建一个。
  2. 添加一行内容并保存。
     *.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 中当作二进制文件处理。

贡献者

更新日志

2025/3/5 03:11
查看所有更新日志
  • 32e62-improve(docs): use chinese punctuation
  • 1289a-improve(docs): delete extra whitespace and blank lines
  • c2111-modify(docs): remanage folders and rename files
  • bcf18-docs: update docs
  • 0440f-更改navbar
  • 978a9-整理文章格式
  • 6374d-update
  • 134d7-更新主题
  • afddf-新增文章

Keep It Simple