浅析warning LF will be replaced by CRLF
有时候我们会遇到这样的情况
$ 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 替换。
该文件将在您的工作目录中具有其原始行结尾。显然,问题出在不同操作系统所使用的换行符是不一样的,一般有两种情况会导致这个问题:
我们的团队成员是 Linux/Mac 平台并参与了项目的 git 提交
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
当设置成 true 时,这意味着你在任何时候添加(add)文件到 git 仓库时,git 都会视为它是一个文本文件(text file)。它将把 crlf 变成 LF。
当设置成 false 时,git 将不做转换操作。文本文件保持原来的样子。
设置为 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/switch
或git clone
时,Git 自动把 LF 转换成 CRLF
2.如果我们是 Linux 或 Mac 平台,是不需要“在
git checkout/switch
或git 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 上用记事本看的话会出现黑点