Windows git“警告:LF将被CRLF取代”,该警告尾是否向后?


147

环境:

  • Windows 7的
  • msysgit

当我git commit说:

warning: LF will be replaced by CRLF. 

这个警告尾巴向后吗?
我在Windows中编辑文件,此行的结尾是CRLF,如图所示:
在此处输入图片说明
git将其更改LF为提交回购。
所以我认为正确的警告是:

warning: CRLF will be replaced by LF. 


2
@devnull我的意思是警告是向后退,是吗?
Honghe.Wu

@ Honghe.Wu不,它不在Windows上。我在下面
VonC

11
这是一个很大的问题,因为确实,警告似乎是落后的。收到关于在提交时转换为CRLF的警告,确实令人困惑,并且没有任何解释Git对空白的处理将有所帮助的信息,因为警告是向后的
Stijn de Witt

1
@StijndeWitt我希望看到您发表评论以支持它。
user1460043

Answers:


184

警告:LF将被CRLF取代。

根据您使用的编辑器的不同,不必将带有LF的文本文件保存在CRLF中:最近的编辑器可以保留 eol样式。但是那个git config设置坚持要改变那些...

只需确保(如我在这里推荐):

git config --global core.autocrlf false

这样,您可以避免任何自动转换,并且仍然可以通过.gitattributesfilecore.eol指令指定它们。


Windows git“ LF将被CRLF替换”
这条警告尾是否向后?

否:您使用的是Windows,并且git config帮助页面上确实提到了

即使您CRLF的存储库中没有标准化的行尾,也要在工作目录中使用行尾,请使用此设置。

如“ 用CRLF替换LF的git ”中所述,它仅应在结帐时(而不是提交时)通过进行core.autocrlf=true

       repo
    /        \ 
crlf->lf    lf->crlf 
 /              \    

小鹏回答所述,该警告与以下内容相同:

警告:(如果将其签出/或使用当前core.autocrlf配置克隆到其他文件夹,)LF将被CRLF替换。
该文件将在(当前)工作目录中具有其原始行结尾。

git-for-windows/git问题1242中所述

我仍然感到此消息令人困惑,该消息可以扩展为包含对该问题的更好的解释,例如:“ file.json在删除文件并再次签出后,LF将由CRLF替换。”

注意:Git 2.19(2018年9月)在使用时core.autocrlf现在已取消了伪造的“ LF将被CRLF替换”警告


作为quaylar正确的意见,如果有就犯了转换,它是LF唯一的。

该特定警告“ LF will be replaced by CRLF”来自convert.c#check_safe_crlf()

if (checksafe == SAFE_CRLF_WARN)
  warning("LF will be replaced by CRLF in %s.
           The file will have its original line endings 
           in your working directory.", path);
else /* i.e. SAFE_CRLF_FAIL */
  die("LF would be replaced by CRLF in %s", path);

它由调用convert.c#crlf_to_git(),本身由调用,本身由convert.c#convert_to_git()调用convert.c#renormalize_buffer()

最后一个renormalize_buffer()仅由调用merge-recursive.c#blob_unchanged()

所以我怀疑git commit只有在所说的提交是合并过程的一部分时,这种转换才会发生。


注意:在Git 2.17(2018年第二季度)中,代码清理添加了一些解释。

提交8462ff4(2018年1月13日)由托斯滕Bögershausen( )tboegi
(通过合并JUNIOÇ滨野- gitster-提交9bc89b1,2018年2月13日)

convert_to_git():safe_crlf / checksafe变成int conv_flags

调用时convert_to_git(),该checksafe参数定义了如果EOL转换(CRLF --> LF --> CRLF)不能完全往返的话会发生什么。
此外,它还定义了行尾是否应该重新规范化(CRLF --> LF)或保持原样。

checksafe是safe_crlf具有以下值的枚举:

SAFE_CRLF_FALSE:       do nothing in case of EOL roundtrip errors
SAFE_CRLF_FAIL:        die in case of EOL roundtrip errors
SAFE_CRLF_WARN:        print a warning in case of EOL roundtrip errors
SAFE_CRLF_RENORMALIZE: change CRLF to LF
SAFE_CRLF_KEEP_CRLF:   keep all line endings as they are

请注意,在Git 2.17周期中,在8462ff4中引入的回归(“ convert_to_git()safe_crlf/checksafe变为int conv_flags”,2018-01-13,Git 2.17.0)导致尽管设置,但autocrlf重写仍会产生警告消息 。safecrlf=false

参见Anthony Sottile()提交6cb0912(2018年6月4日(通过合并JUNIOÇ滨野- -提交8063ff9 6月28日2018)asottile
gitster


1
是的,大多数编辑器可以保留EOL样式,但是对于大多数编辑器,在同一项目中创建新文件时无效。确保您不签出LF项目,以为“ psh,我的编辑器可以处理LF行尾,我不需要autocrlf”,然后忘记手动将新文件设置为LF行尾。

15
@VonC我必须承认我没有得到它。Git-Book声明Git可以通过在提交时将CRLF行尾自动转换为LF来解决此问题,反之亦然,当它在文件系统中签出代码时反之亦然。这意味着在提交时将有一个到LF的转换,而从未转换为CRLF。这表示上述警告不正确。有core.autocrlf=true始终 在LF产生的回购,并在CRLF工作树恕我直言(甚至在非Windows)。来源:链接
quaylar,2014年

12
“此警告尾部是否向后?应该只在结帐时出现?”我在commit上看到此确切警告。所以,是的,它是落后的。向后触发了我的搜索。很高兴其他人也注意到了!实际阅读这些警告的人会看到它说它将在提交消息时转换为CRLF,这非常令人困惑。
Stijn de Witt

7
“因此,我怀疑只有在所述提交是合并过程的一部分时,此转换才会在git提交上发生。” 不。我在常规提交中看到了这一点。
Stijn de Witt

3
使我感到困惑的部分是,该消息会突然弹出。为什么需要警告git会完全按照我配置的去做。我不需要警告说“嘿,我们仍在像您要求的那样为您转换行尾”。当系统按设计运行时,它不应发出不必要的警告,否则人们会在无关紧要的消息中错过重要的警告。
布伦特·拉森

27

的,警告是向后的。

实际上,它甚至根本不应该是一个警告。因为所有这些警告都在说(但倒退是不幸的)是文件中带有Windows行尾的CRLF字符将在提交时被LF替换。这意味着将其标准化为* nix和MacOS使用的相同行尾。

没什么奇怪的,这正是您通常想要的行为。

当前形式的警告是两件事之一:

  1. 不幸的错误加上过分谨慎的警告消息,或者
  2. 一个非常聪明的情节,可以让您真正地考虑一下...

;)


1
奇怪的是,如果您将Windows上的本地文件强行转换为LF,则您甚至无法git add这些文件,该消息会抱怨并使您的提交无效。
phpguru

24

-7月9日更新-

删除了@mgiuca评论的“它是正确和准确的”

======

NO。并不是说您目前使用的文件CRLF。而是用谈论文件LF

它应显示为:

警告:(如果您将其签出/或使用当前core.autocrlf配置克隆到另一个文件夹,)LF将替换为CRLF

该文件将在您的(当前)工作目录中具有其原始行结尾。

该图片应说明其含义。 在此处输入图片说明


1
好的插图。+1。我在我的参考文献中提供了更多答案。
VonC

最适合我的是:1)core.autocrlf = false 2)在Intellij设置行分隔符(\ n)中。我在Mac和Windows上都使用Intellij Idea。
小鹏-ZenUML.com

当文件是在Windows中创建的,但其unix / mac行结尾(lf)并且git config属性autocrlf为true时,可能会发生这种情况。本质上git不会更改您创建的文件,但是它将检出它/使用Windows行尾对其进行克隆(由于autocrlf设置)
Patrick

1
如果必须通过“如果您将其签出/或使用当前core.autocrlf配置克隆到另一个文件夹”来限定警告,那么警告的正确性和准确性如何。这不是原始消息所说的。它说它将(不可能)用CRLF代替,这意味着它将以CRLF模式存储在仓库中,而不是在某些假设的未来结帐中。
mgiuca

12

所有这些都假设 core.autocrlf=true

原始错误:

警告:LF将被CRLF替换
。文件将在您的工作目录中具有其原始行结尾。

错误应显示为:

警告:LF将在您的工作目录中被CRLF替换。
该文件将在git存储库中具有其原始LF行结尾

在这里说明:

这种便捷转换的副作用是警告,它的意思是,如果您最初编写的文本文件以LF结尾而不是CRLF,它将照常与LF一起存储,但是在选中时以后将有CRLF结尾。对于普通的文本文件,通常就可以了。在这种情况下,警告是“仅供参考”,但是如果git错误地将二进制文件评估为文本文件,则这是一个重要的警告,因为git会破坏您的二进制文件。

基本上,以前是LF的本地文件现在将在本地具有CRLF


7

git config --global core.autocrlf false 适用于全局设置。

但是,如果您使用的是Visual Studio,则可能还需要修改.gitattributes某些类型的项目(例如c#类库应用程序):

  • 删除线 * text=auto

1

之后我把core.autocrlf=true我得到的“LF将CRLF改为”(注意不是“CRLF将被替换为LF”)我是在git add荷兰国际集团(或者也许是它的git commit编辑?)在Windows文件上的存储库(即不使用LF)我设置之前已签出core.autocrlf=true

我进行了新的结帐,core.autocrlf=true现在没有收到这些消息。


0

如果您使用的是Visual Studio 2017、2019,则可以执行以下操作:

  1. 打开主.gitignore(在解决方案的其他项目中更新或删除另一个.gitignore文件)
  2. 粘贴以下代码:
[core]
 autocrlf = false
[filter "lfs"]
 required = true
 clean = git-lfs clean -- %f
 smudge = git-lfs smudge -- %f
 process = git-lfs filter-process

1
该“代码”看起来应该位于.gitconfig或或.git/confignot 这样的配置文件中,该配置文件.gitignore指定git忽略的文件。
大卫

我将此添加到.git / config中,但仍然出现“警告:CRLF将被LF取代”
Sergei

0

做简单的事情:

  1. 打开git-hub(Shell)并导航到目录文件(cd / a / b / c / ...)
  2. 执行dos2unix(有时是dos2unix.exe)
  3. 立即尝试提交。如果再次遇到相同的错误。执行上述所有步骤,但不使用dos2unix,而是执行unix2dox(有时是unx2dos.exe)
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.