Git:自制文件有行结束问题

时间:2017-05-17 22:30:15

标签: windows git newline clion lf

所以,我有一个新的回购,我试图开始一个合作项目。我已经将.gitignore.gitattributes(处理auto-crlf)文件推送到它。

我的.gitattributes文件是:

# Set the default behavior, in case people don't have core.autocrlf set.
* text=auto

# Explicitly declare text files you want to always be normalized and converted
# to native line endings on checkout.
*.c text
*.h text

# Declare files that will always have CRLF line endings on checkout.
*.sln text eol=crlf

# Denote all files that are truly binary and should not be modified.
*.png binary
*.jpg binary
*.mdj binary

我在GitHub上创建了一个存储库,并通过SourceTree将其克隆到我的PC上。现在,我试图在其中创建一个新的CLion项目,但是当我尝试添加 CMakemain.c文件时,我得到一个LF到CRLF错误:

The following problems have occurred when adding the files:
fatal: LF would be replaced by CRLF in tpCuat/CMakeLists.txt
 during executing git "C:\Program Files\Git\cmd\git.exe" -c core.quotedpath=false add --ignore-errors -- tpCuat/CMakeLists.txt

问题是,这些文件是我在Windows中创建的(实际上是CLion),因此我无法理解为什么会出现此错误。

1 个答案:

答案 0 :(得分:2)

此警告(或错误)意味着:您的文件中有换行符(\n,ASCII 10),并且您有一个配置告诉Git它应该进行CRLF转换。在这种情况下,它是您的.gitattributes

* text=auto

这是一个问题,因为Git告诉您它无法为您提供保证,即您在中放置的文件将是您以后的文件 out

当您将此文件添加到存储库(git add)时,text=auto属性会告诉Git将文件中的所有CRLF(\r\n,ASCII 13后跟ASCII 10)转换为裸线换行(\n,ASCII 10)将其存储在存储库中时。当Git随后尝试将文件放在磁盘上(git checkout)时,它会在写入文件时将文件中的所有换行符(\n)转换为CRLF(\r\n)。

当您将裸线换行放入文件但告诉Git进行CRLF转换时,它无法对此进行往返。考虑一下你是否有一些文件(说明了行尾):

line one\r\n
line two\r\n
line three accidentally ends with a newline!\n
line four\r\n

现在,当Git将其添加到存储库时,它将执行CRLF转换并存储:

line one\n
line two\n
line three accidentally ends with a newline!\n
line four\n

当它再次检查出来时:

line one\r\n
line two\r\n
line three accidentally ends with a newline!\r\n
line four\r\n

注意第三行现在如何在原始文件中没有CRLF(\r\n)时结束? 那是 Git在这里警告你的事情。它告诉你,它无法准确地回复你所投入的内容。

如果这对您来说是个问题,那么您应该启用core.safecrlf以便Git在发生这种情况时错误并要求您修复行结束问题。否则,如果您不在乎,可以放心地忽略此警告。

为什么CLion做一些愚蠢的事情就像在你的文件中放一个裸线?好吧,完全是另一个问题!