Skip to content

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

1301字约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 的配置, 有三种取值: true, false, input.

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

变更历史

最后更新于: 查看全部变更历史
  • 更改navbar

    于 2024/11/4
  • 整理文章格式

    于 2024/10/29
  • update

    于 2024/10/22
  • 更新主题

    于 2024/10/22
  • 新增文章

    于 2024/10/21