为什么GIT在写入工作目录时不将CRLF替换为LF,尽管core.autocrlf设置为input?

为什么GIT在写入工作目录时不将CRLF替换为LF,尽管core.autocrlf设置为input?,git,core.autocrlf,Git,Core.autocrlf,最近我摆弄了gits选项core.autocrlf并将其设置为input。我测试了配置参数是否设置正确: $ git config --global core.autocrlf input $ git config core.autocrlf input 然后为了测试gits的行为,我删除了项目文件夹的所有内容(当然除了文件夹.git)并创建了一个 git reset --hard HEAD 但我的编辑告诉我,行尾仍然是CRLF 为什么? (我在Ubuntu上,使用Atom作为编辑器。ed

最近我摆弄了gits选项
core.autocrlf
并将其设置为
input
。我测试了配置参数是否设置正确:

$ git config --global core.autocrlf
input

$ git config core.autocrlf
input
然后为了测试gits的行为,我删除了项目文件夹的所有内容(当然除了文件夹
.git
)并创建了一个

git reset --hard HEAD
但我的编辑告诉我,行尾仍然是
CRLF

为什么?

(我在Ubuntu上,使用Atom作为编辑器。editors语句似乎是有效的,因为当我告诉它将所有行尾更改为
LF
,git告诉我文件的每一行都已更改。)

为了进一步了解整个主题,我阅读了这篇启发性的文章:


core.autocrlf=input
仅在将文件结尾添加到索引(并提交)时采用文件结尾

它不会在到工作区的途中修改文件。您需要使用
true
来实现这一点,并且大多数情况下,对于本机行尾不是LF的旧Mac和Windows

但最有可能的是.gittributes是更适合您的系统,正如您在文章中所讨论的那样。

来自:

如果您在Linux或Mac系统上使用LF行结尾,那么您不希望Git在签出文件时自动转换它们;但是,如果意外引入了一个以CRLF结尾的文件,那么您可能需要Git来修复它。您可以告诉Git在提交时将CRLF转换为LF,但不能通过将core.autocrlf设置为input来实现

显然,它只在提交时进行转换。

core.autocrlf=input

不会更新现有文件。它只会将添加的文件行尾设置为所需格式

core.autocrlf

将此变量设置为
true
几乎与将所有文件上的文本属性设置为
auto
相同,只是文本文件不保证规范化:存储库中包含CRLF的文件不会被触碰

如果您希望在工作目录中有CRLF行尾,即使存储库没有标准化的行尾,也可以使用此设置

此变量可以设置为输入,在这种情况下不执行输出转换


core.autocrlf=input

这意味着Git将处理所有文本文件,并确保在将该文件写入对象数据库时将CRLF替换为LF。然而,它不会做相反的事情


我更改了
文件.a
并提交了它。然后我又删除了工作目录的内容。git重置了吗?硬头检查了行尾。仍然
CRLF
。现在,根据您的建议,
文件。编辑了一个
,将更改写入对象数据库,并写回工作目录。所有都带有
core.autocrlf输入
。它现在不应该这样做吗?可能该文件没有被识别为文本文件。您可以使用以下命令,如果文件被识别为文本,它将报告该文件:
git grep-I--name only--untracked-e。--file.a
。它将其识别为文本文件。它有一个正确的区别。可能行尾的转换只是在一个新文件被添加到索引时发生的?可能,太懒了,不敢尝试:)我通常用dos2unix手动修复一次行尾。我测试了它。是的,只有在添加带有
CRLF
结尾的新文件并提交时,才会更改行结尾。但即使是带有
CRLF
结尾的代码段也不行。