Git使用CRLF替换LF

1219
在Windows机器上,我使用git add添加了一些文件。我收到了警告信息:

LF将被替换为CRLF

这种转换会有什么影响?

20
@apphacker,标准化行尾比在比较两个文件时自己更改它们要少让人烦恼。(当然,如果您不同意,那么可以保持关闭core.autocrlf功能)。 - RJFalconer
3
除非整行被触碰,否则为什么行末会不同。 - Bjorn
4
我经常会涉及到很多行代码,因为我正在尝试不同的想法,并添加跟踪语句以查看它们的工作情况等。然后,我可能只想提交对两三行代码的更改,而让 git 完全忽略其他代码,因为我认为它们已经被恢复成了原来的样子。 - Tyler
7
@MatrixFrog: 你的编辑器好像出了问题,无法自动检测行尾结束符是哪种。它是哪一种呢? 我工作于混合项目中,该项目必须在同一个存储库中同时包含一些 LF 文件和一些其他的 CRLF 文件。对于任何现代编辑器来说都不是问题。让版本控制(或文件传输)搞乱行尾结束符来解决编辑器限制是最糟糕的想法——仅从下面的解释长度就可以明显看出。 - MarcH
7
我知道的唯一一个在现代编辑器中做错事情的是Visual Studio。Visual Studio可以轻松地打开带有LF行尾的文件。如果您插入新行,它将插入CRLF,并保存混合行尾。微软拒绝修复此问题,这是一个相当大的瑕疵,否则这个IDE还是相当不错的:--( - Jon Watte
显示剩余7条评论
25个回答

17
从~/.gitattributes文件中移除以下内容:* text=auto,将防止Git在首次检查行尾。

7
错误。如果存在该行,则将覆盖 core.autocrlf 的配置。如果将其设置为'true',那么删除该行并不会阻止 git 检查行尾。 - Arafangion
1
不过,如果将core.autocrlf设置为false,即使这个选项没有被移除设置autocrlf为false也不会有太大的帮助,所以这个选项对我有帮助(但仅此一项还不够)。 - Matty
2
点赞这个!!虽然“将阻止git检查”的部分在技术上并不正确,但这是唯一一个特别提到.gitattributestext=设置的答案(如果存在,将会是一个阻塞器)。因此其他答案是不完整的。我疯了似地试图弄清楚为什么无论我如何更改我的autocrlfsafecrlf设置并检出和清除git缓存和硬重置,我的文件都继续显示为“修改”。 - jdunk

15

如何让Git忽略不同的行结尾标记

http://www.rtuin.nl/2013/02/how-to-make-git-ignore-different-line-endings/(无法访问)

您可以通过更改.gitattributes文件中的条目来完全禁用CRLF行为,或按文件类型进行更改。在我的情况下,我放了这个:

  • -crlf 这告诉Git忽略所有文件的行结束标记,并且不更改工作目录中的文件。即使您已将core.autocrlf设置为true、false或input。
echo "* -crlf" > .gitattributes

如果您进行单独提交,Git 就不会因为您做了一次更改而将整个文件视为修改(这取决于您是否更改了 autocrlf 选项)。

这样做确实有效。Git 将尊重混合行尾项目中的行尾,并且不会向您发出警告。


2
当你想在CRLF和LF之间进行转换,但是你有一些必须保持完整的.sh文件时,这将非常有用。我经常使用*.sh -crlf... - MartinTeeVarga
1
最佳解决方案。结合使用git rm --cached -r .git reset --hard,适用于项目中的每个人。 - philk
第二个链接已经失效:"500 内部服务器错误"。 - Peter Mortensen
嗨@PeterMortensen,关于您的编辑,由于git是一个源自大小写敏感环境的命令行程序,将其称为“git”而不是“Git”是否更合理? - Michael Ribbons

13

我对Windows上的Git不是很了解,但是...

在我看来,Git会将返回格式转换为与运行平台(Windows)匹配。CRLF是Windows的默认返回格式,而LF是大多数其他操作系统的默认返回格式。

当代码移动到另一个系统时,返回格式很可能会被正确调整。我认为Git足够聪明,能够保持二进制文件的完整性,而不是尝试在JPEG文件中将LF转换为CRLF。

总之,你可能不需要过于担心这个转换。但是,如果您要将项目存档为tarball,其他程序员可能会更喜欢LF行终止符而不是CRLF。根据您的关注程度(以及您不使用Notepad),您可能希望设置Git使用LF返回,如果可以的话 :)

附录:CR是ASCII码13,LF是ASCII码10。因此,CRLF是两个字节,而LF是一个字节。


7
由于似乎没有人提到过,CR代表“回车”,LF代表“换行”。另外需要注意的是,许多Windows编辑器会在不提醒用户的情况下将使用LF字符作为换行符的文本文件静默地更改为由两个字符CRLF组成。但Git会注意到这种变化。 - user2548343
Windows使用CRLF(回车/换行-类似于机械打字机)。Mac使用CR,*nix使用LF...而这场战争将超越所有其他战争... - skeetastax

12
应该这样写:

警告:(如果你检出或克隆到另一个文件夹,而当前的core.autocrlf为true),LF将被CRLF替换。该文件在你(当前的)工作目录中会保留其原始行结尾。

这张图片应该能解释它意味着什么。

Enter image description here


这也意味着,如果你将它发送到Subversion(如果你这样做),它将具有转换。 - jpaugh

9

确保您已安装最新版本的Git

我按照之前的答案执行了git config core.autocrlf false,但在使用Git(版本2.7.1)时它没有起作用。

然后当我升级Git(从2.7.1到2.20.1)时,它现在可以工作了。


我想你的意思是你有Git 2.17.1版本。我也遇到了同样的问题,更新后问题得以解决。很高兴看到你的答案! - Phillip McMullen

7

CRLF可能会在两个不同的操作系统(Linux和Windows)中使用您的“代码”时造成一些问题。

我的Python脚本是在Linux Docker容器中编写的,然后使用Windows的Git Bash进行推送。它警告我LF将被CRLF替换。我没有太在意,但后来当我启动脚本时,它显示:

/usr/bin/env: 'python\r': 没有那个文件或目录

现在对于您来说,这是一个带有\r的影响。Windows在'\n'的基础上使用“CR” - 回车符 - 作为换行符 - \n\r。这是您可能需要考虑的事情。


这一点应该更加强调!对于Windows开发人员来说,使用Docker并启动Linux容器是很常见的——如果你使用git带入一个shell脚本,并将LF转换为CRLF,那么它就会出问题。 - Evan Morrison

7

其他答案对于一般概念已经很好了。我遇到了一个问题,在更新后,现有存储库仍会出现警告,因为之前的提交中存在问题。

使用 --renormalize 添加可以解决问题,例如:

git add --renormalize .

来自文档

"强制重新将所有跟踪文件新鲜“清理”处理,并将它们再次添加到索引中。这在更改core.autocrlf配置或文本属性以纠正错误的CRLF / LF行结尾添加的文件之后非常有用。此选项意味着-u。"


确实已经改变了。这个命令对我也有效。 - sAm

6

我经历了相同的错误。 这是在Windows 10上安装NVM NVM后发生的。

在所有级别中设置autoclrf无效。

在CMD中我使用了: "git ls-files --eol"

i/lf    w/crlf  attr/             src/components/quotes/ExQuoteForm.js
i/lf    w/lf    attr/             src/components/quotes/HighlightedQuote.js

结论:

我创建的文件有不同的后缀。

要更改这些文件并重置,请执行以下操作:

git config core.autocrlf false
git rm --cached -r .
git reset --hard

尽管如此:

在一些项目中,我需要删除仓库并重新开始。


6
  1. Notepad++中打开文件。
  2. 转到菜单编辑换行符转换
  3. 点击Windows 格式
  4. 保存文件。

2
还可以尝试使用 git config --global core.autocrlf false 命令,防止 Git 在提交时将行结尾设置为 Unix。接着使用 git config core.autocrlf 命令进行检查,确保其已经被设置为 false。 - Contango

6

这个问题与Windows相关,而且我不能使用其他方法而不进入目录甚至在Notepad++中以管理员身份运行文件也行不通......

所以必须采用以下方式:

cd "C:\Program Files (x86)\Git\etc"
git config --global core.autocrlf false

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接