Git,将文件添加到代码库时出现致命错误,提示 LF -> CRLF。

41

我对git还不熟悉,需要一些帮助。我在Windows上使用msysgit。

当我执行命令git add [folderName]时,我得到以下响应:

fatal: LF would be replaced by CRLF in [.css file or .js file]

然后如果您尝试提交,什么也不会发生。

$ git commit
# On branch master
#
# Initial commit
#
# Untracked files:
#   (use "git add <file>..." to include in what will be committed)
#
#       so01/
nothing added to commit but untracked files present (use "git add" to track)

一些 css/js 文件是从网络下载的,所以它们会有 LF。如果我打开该文件并剪切/粘贴内容,则会在下一个文件上出现错误,依此类推。

非常感谢任何帮助。

编辑

core.autocrlf 设置为 false 似乎解决了问题,但我在许多帖子中读到不要将该选项设置为 false。

请问有人能指出我在哪里可以找到可能在这种情况下出现的问题?


你是否与其他使用非Windows环境的人一起工作? - Adam Dymitruk
2
不,我正在开发一个小应用程序,将其放在AppHarbor上。到目前为止一切都很好,但我想知道这些选项之间的区别。在完成应用程序后,我计划进行一些研究,但同时我想使用SO来快速解决问题。 - user619656
那就更应该将 autocrlf 设置为 false。你不需要这个麻烦。提交原始文件即可。很遗憾,安装 msysgit 时的默认设置采用了最糟糕的选项。 - Adam Dymitruk
4个回答

24

我对这个还很陌生,所以将core.autocrlf设置为false对我来说并不太有意义。因此,对于其他新手,请前往您的.git文件夹中的配置文件,并添加:

[core]
    autocrlf = false

在 [core] 标题下方。


22

信任代码编辑器来处理您的换行符。自动CRLF应该为false。不要让源代码控制工具变得太聪明。如果不需要源代码控制工具更改您的行尾,就不要更改。这会带来麻烦。

重申一个被接受的答案:“除非您可以看到必须处理本地EOL的特定处理方式,否则最好将autocrlf设置为false。”

还有来自progit书中关于autocrlf部分末尾的话:

“如果您是在Windows上做仅限于Windows项目的程序员,则可以关闭此功能,通过将配置值设置为false来记录回车符号。”

我能给出的唯一其他帮助是,如果您采用其他方法,请熟悉vim -b,它将显示MSysGit中的CR等特殊字符,以及git show HEAD:path/to/your/file.txt,它应该以git存储的方式显示文件。

core.whitespace cr-at-eol设置为使补丁和差异不将CR视为可能存在问题的空格。

不值得麻烦。存储原样即可。


2
是的,在Windows上是真的。再次强调,除了将autocrlf设置为false之外,不要做任何其他操作。在过去的4年中,我一直在Windows/.NET上与多个团队进行这样的操作。你可以做其他事情来让自己跌倒和受伤,但最终你还是会将autocrlf设置为false。 - Adam Dymitruk
3
为什么你的个人经验关于Windows/.NET更重要,而且在http://progit.org/book/ch7-1.html中推荐了什么?(注意:已经翻译为中文) - prusswan
1
作为一名主要使用Windows操作系统并在使用多个操作系统的团队中工作的用户,我的观点仍然是零星的。文档是正确的,并且它非常依赖于存储库。盲目地将core.autocrlf设置为false不是您应该提供的建议类型,这只是错误信息。 - prusswan
+1 给反对票:这个回答非常有道理。@prusswan:请重新阅读你自己链接的Pro Git页面。它明确指出:“如果你是一个只做Windows项目的Windows程序员,那么你可以关闭这个功能,通过将配置值设置为false来记录回车符号在代码库中。”除非你能指出一些在仅限Windows环境下autocrlf=false实际上引起问题的具体案例,否则任何将其设置为true的指示都只是盲目遵循的建议。 - jammycakes
2
OP声称这是一个仅限于Windows的项目,并不是支持core.autocrlf=false应该总是被使用的一个合理理由。我几乎无法理解你的推理,即跨平台开发是例外而不是规则,许多开发人员将参与具有不同架构的项目,特别是在Java世界中,如果不使用core.autocrlf=false,编辑器会为行结尾而战,这确实会变得麻烦。Visual Studio还有一个额外的烦恼,它只会更改您编辑的文件部分的行结尾,而不是整个文件。 - Brett Ryan
显示剩余2条评论

6
问题可能出现是因为您设置了Git使用core.eol设置以crlf内部存储文件。当您添加文件时,Git会警告您将更改其格式。
Git最适合使用lf行结尾,因此如果可能的话,请始终使用core.eol = lf
这应该解释了何时使用core.autocrlf为什么应该在Git中使用core.autocrlf=true? 您还可以使用core.safecrlf。有关设置的详细信息,请查看git config --help

你链接的答案指出:“除非你能看到必须处理本地行尾的特定处理,否则最好将 autocrlf 设置为 false。” - Adam Dymitruk
我不确定为什么我被踩了?我有什么遗漏的吗?@AdamDymitruk 它还提供了一些可以使用它的情况。我认为知道为什么有这个选项很有用(如果我永远不应该使用它,那为什么我可以设置它?) - m0tive

0

Git自动检测格式的功能非常好用。因此,在Windows上使用core.autocrlf=true是一个非常好的主意。

使用git config --global core.safecrlf=false告诉Git:嘿,请将我的“错误”的行尾(仅为LF)转换为Windows行尾(CRLF),并且不要打扰我。

因此,您应该真正禁用core.safecrlf

更长的答案请参见:https://dev59.com/EmUp5IYBdhLWcg3wLVKn#15471083


@downvoters:请简要说明为什么您会对此回答进行负评。这有助于(i)他人了解为什么此回答没有得到投票,以及(ii)改进回答。 - koppor

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