所以,我有一个新的回购,我试图开始一个合作项目。我已经将.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项目,但是当我尝试添加 CMake
和main.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),因此我无法理解为什么会出现此错误。
答案 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做一些愚蠢的事情就像在你的文件中放一个裸线?好吧,完全是另一个问题!