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 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
问题是,这些文件是我(实际上是 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 会做一些愚蠢的事情,比如在您的文件中添加一个空的换行符?好吧,这完全是另一个问题!
所以,我有这个新的存储库,我正在尝试启动一个协作项目。我已经将 .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 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
问题是,这些文件是我(实际上是 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 会做一些愚蠢的事情,比如在您的文件中添加一个空的换行符?好吧,这完全是另一个问题!