Git : 自制文件有换行问题

Git : Self-made file has line-ending problems

所以,我有这个新的存储库,我正在尝试启动一个协作项目。我已经将 .gitignore.gitattributes(处理自动 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 将其克隆到我的电脑上。现在,我正在尝试在其中创建一个新的 CLion 项目,但是当我尝试 add 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

问题是,这些文件是我(实际上是 CLion)在 Windows 中创建的,所以我不明白为什么会出现此错误。

此警告(或错误)的确切含义是:您的文件中有换行符(\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 会做一些愚蠢的事情,比如在您的文件中添加一个空的换行符?好吧,这完全是另一个问题!