尝试提交 Git 文件但出现错误 :: 致命错误: LF 将被 CRLF 替换于 <某个存储库中的文件>

74

当我试图提交一些更改后的文件时,使用TortoiseGit会出现以下错误信息:

fatal: LF would be replaced by CRLF in <some file in the repo>

在我得到通常的LF vs CRLF答案之前,我知道并理解这个争论是关于什么的。其次,我也设置了全局设置:

core.autocrlf true

第三,我有一个.gitattributes文件

所以,我想确保我们的文件被强制使用CRLF

我不明白的是,它说FATAL并阻止我继续。警告?当然可以!我知道我要做什么吗?我知道!

我只想让它静默地转换并闭嘴。

或者,如果它被强制阻止,是否有一种方法可以更新存储库中的所有文件以使用CRLF,以便不再发出此警告?

这些存储库是私有的,因此它们将永远不会在 Windows + Visual Studio 之外开发。
我该如何继续?
6个回答

79

如果您只想收到警告而不是致命错误,您可能希望将core.safecrlf设置为"warn"。

来自"git config"管理页面

core.safecrlf


如果设置为true,则使Git在启用换行符转换时检查是否可逆转换CRLF。 Git将验证命令是否直接或间接地修改了工作树中的文件。
例如,提交一个文件,然后检出相同的文件应该在工作树中产生原始文件。 如果对于core.autocrlf的当前设置不是这种情况,则git将拒绝该文件
该变量可以设置为“warn”,这种情况下,git只会警告不可逆转换,但会继续操作。
CRLF转换有损数据的轻微风险。
启用它后,git会在提交期间将CRLF转换为LF,并在检出期间将LF转换为CRLF。
在提交之前包含LF和CRLF混合的文件无法通过git重新创建
对于文本文件,这是正确的做法:它纠正了行尾以使我们在存储库中只有LF行尾。
但是对于意外分类为文本的二进制文件,转换可能会损坏数据
如果您及早识别到这种损坏,可以通过在.gitattributes中显式设置转换类型来轻松修复它。
在提交后,您仍然拥有原始文件,并且此文件尚未损坏。 您可以明确告诉git此文件是二进制文件,git将适当处理该文件。
不幸的是,清理混合行结尾文本文件的期望效果和破坏二进制文件的不良效果无法区分。
在这两种情况下,都以不可逆转换方式删除CRLFs。 对于文本文件,这是正确的做法,因为CRLFs是行结尾符,而对于二进制文件,转换CRLFs会破坏数据。

我更喜欢只使用.gitattributes文件(具有您所拥有的core.eol设置)来确定我想要强制执行eol的确切文件或文件类型,并将autocrlf设置为false。

如果出现混合eol的文本文件,博客文章建议采取以下步骤:

如果您的计算机上安装了Notepad ++,请按照以下步骤操作。

  1. 打开出现致命问题的文件。
  2. 单击编辑 -> EOL转换,然后选择Windows格式或您在提交时遇到问题的任何格式。

警告,如果您使用的是Git 2.17或2.18:在Git 2.17周期中引入的回归(“8462ff4”)(“convert_to_git(): safe_crlf/checksafe becomes int conv_flags”,2018-01-13,Git 2.17.0)导致autocrlf重写会产生一个警告信息,尽管设置了safecrlf=false

查看 commit 6cb0912 (2018年6月4日) 由 Anthony Sottile (asottile) 提交。
(合并自 Junio C Hamano -- gitster --commit 8063ff9 中,2018年6月28日)


1
非常好的回答!问题:1. 为什么 git 想要在提交时存储 LF(即将 CRLF 转换为 LF,反之亦然)?我实际上认为它是相反的 blush...把 LF 存储为 CRLF。(我也理解 Windows 使用 CRLF EOL 而其他操作系统通常使用 LF)。2. 如果将 AutoCrlF 设置为 false... 那么 ".gitattributes" 文件中的一行样本会是什么?正是我拥有的内容吗?所以我的 .gitattributes 文件是否会正确转换? - Pure.Krome
1
@Pure.Krome 1. git默认会将eol转换为最初设计运行的操作系统(Linux)所需的格式。2. 如果将core.autocrl设置为false,则可以使用core.eol控制eol转换,因此,是的,您的.gitattributes文件看起来很好,您只需要测试它/完善它以覆盖您实际想要转换的文件即可。 - VonC
1
我在使用notepad++编写文件并让pgAdmin保存时遇到了问题。只是提醒一下。 - Love and peace - Joe Codeswell

40
git config --global core.safecrlf false

这对我帮助很大。确实对我有效。我不知道为什么其他指南对我不适用。 - Tung
感谢分享解决方案。在 Visual Studio 2017 内部使用内置的 Git 工具对我很有帮助。 - Fairuz Sulaiman

15

这将禁用crlf致命警告。

git config core.autocrlf false
git config core.safecrlf false

或者 git config core.safecrlf warn - tenshi

6

由于您的仓库是私有的,您可以像这样设置git-config:

git config --global core.autocrlf false

这将解决您的问题。如果您有任何进一步的问题, 您可以阅读《Pro git》:

如果您是一个Windows程序员,做一个仅限于Windows的项目,那么您可以关闭此功能,通过设置配置值为false来记录回车符: $ git config --global core.autocrlf false

但是在协作时,最好执行以下操作:

  1. 添加 .gitattributesGithub help-处理行尾会很有帮助。
  2. git config --global core.safecrlf true
    • windows:git config --global core.autocrlf true
    • mac 或 linux:git config --global core.autocrlf input

您可能想阅读 Git文档-git配置 以获得更多信息。


2

git config --global core.autocrlf false会将带CRLF的文件提交,但这不是常用的方式。

我注意到在Windows上,core.autocrlf true不支持LF格式的文件,而core.autocrlf input则不支持CRLF格式的文件。

所以:使用core.autocrlf true来提交CRLF格式的文件,使用core.autocrlf input来提交LF格式的文件(或转换为CRLF格式)。

通常,带有LF格式的文件是由代码生成器自动生成的(例如https://start.spring.iohttp://yeoman.io/)。


-1

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