跳至主要內容

浅析warning LF will be replaced by CRLF

AndyBin原创大约 4 分钟

有时候我们会遇到这样的情况

$ git add .
warning: LF will be replaced by CRLF in xxx.
The file will have its original line endings in your working directory

分析

从字面意思上来看:警告:在 gitee_handsome8_0.php 中,LF 将被 CRLF 替换。

该文件将在您的工作目录中具有其原始行结尾。显然,问题出在不同操作系统所使用的换行符是不一样的,一般有两种情况会导致这个问题:

  1. 我们的团队成员是 Linux/Mac 平台并参与了项目的 git 提交

  2. Windows 平台的某些软件会生成换行是 LF 的代码文本(比如 Webstorm 等)

相关信息

Uinx/Linux 采用换行符 LF 表示下一行(LF:LineFeed,中文意思是换行,即“\n”)

Dos 和 Windows 采用回车+换行 CRLF 表示下一行(CRLF:CarriageReturn LineFeed,中文意思是回车换行即“\r\n”)

Mac OS 只使用换行(LF)一个字符来结束一行,早期的 Mac OS 采用回车 CR 表示下一行(CR:CarriageReturn,中文意思是回车,后来 Mac 也投奔了 unix)

git 处理换行

在 Git 中,可以通过以下命令来显示/设置当前你的 Git 中采取哪种对待换行符的方式

git config core.autocrlf ture/false/input
  1. 当设置成 true 时,这意味着你在任何时候添加(add)文件到 git 仓库时,git 都会视为它是一个文本文件(text file)。它将把 crlf 变成 LF。

  2. 当设置成 false 时,git 将不做转换操作。文本文件保持原来的样子。

  3. 设置为 input 时,添加文件 git 仓库时,git 把 crlf 变成 lf。当有人 Check 代码时还是 lf 换行格式。因此在 window 操作系统下,不要使用这个设置。

解决办法

1.如果你目前是 Window 平台并出现该警告,什么也不用做,虽然这个警告难看,但这个警告能保证项目团队正常跨系统 git 操作代码

  • 因为 git 的 Windows 客户端基本都会默认设置 core.autocrlf=true(可通过git config core.autocrlf命令查询 Windows 上该属性是否默认 true。如不是 true,通过config --global core.autocrlf true命令设置该属性为 true),而core.autocrlf=true有以下 3 个功能来避免出错:

    • git add时,Git 自动把 LF 转换成 CRLF,并给出那条警告 LF will be replaced by CRLF

    • git commit时,Git 自动把 CRLF 转换成 LF

    • git checkout/switchgit clone时,Git 自动把 LF 转换成 CRLF

    2.如果我们是 Linux 或 Mac 平台,是不需要“在git checkout/switchgit clone时,Git 自动把 LF 转换成 CRLF”的。然而当一个 CRLF 作为行结束符的文件在 Linux 或 Mac 平台不小心被引入时,你肯定想让 Git 修正。 所以,你可以通过config --global core.autocrlf input命令把 core.autocrlf 设置成 input 来告诉 Git 在 commit 时把 CRLF 转换成 LF,但 git checkout 时不转换

通过上面两个方案,在 Windows 上的 checkout 文件中会保留 CRLF,而在 Mac 和 Linux 上,以及版本库中会保留 LF,从而保证项目团队正常跨系统 git 操作代码。

注意

为什么要注意这个问题呢,因为此问题有一些负面影响:

  • 假如你正在 Windows 上写程序,又或者你正在和其他人合作,他们在 Windows 上编程,而你却在其他系统上,在这些情况下,你可能会遇到行尾结束符问题。此问题的全部负面影响如下:

  • 一个最直接后果就是,Unix/Mac 系统下的一个多行文本文件在 Windows 里打开的话,多行文本会变成一行。(原因:Unix/Mac 换行只用了换行符‘\n’,而 Windows 的换行要求是回车换行符‘\r\n’,因此 Unix/Mac 中的“多行文本”的换行不符合 Windows 的规则,所以 Windows 对这些不符合换行规则的多行文本全部按照没有换行处理,所以导致多行文本会变成一行)

  • 而 Windows 里的文件在 Unix/Mac 下打开的话,在每行的结尾可能会多出一个^M 符号

  • Linux 保存的文件在 windows 上用记事本看的话会出现黑点

上次编辑于:
贡献者: rumosky
评论
  • 按正序
  • 按倒序
  • 按热度