Git autocrlf和eol之间有什么区别

Git autocrlf和eol之间有什么区别,git,gitattributes,Git,Gitattributes,我正在阅读关于.gittributes的文章,以解决混合行尾的问题,并发现有两种类似的设置 AUTOCRLF: 行结束转换,而Git通常只保留文件内容, 可以将其配置为在存储库中将行尾规范化为LF 并且,还可以选择在签出文件时将其转换为CRLF 如果您只是想在工作目录中有CRLF行结尾 无论使用哪个存储库,都可以设置 在不使用任何属性的情况下配置变量“core.autocrlf” [core]autocrlf=true这不会强制文本标准化 文件,但确保您介绍给 存储库将其行结束符规范化为LF 已

我正在阅读关于
.gittributes
的文章,以解决混合行尾的问题,并发现有两种类似的设置

AUTOCRLF:

行结束转换,而Git通常只保留文件内容, 可以将其配置为在存储库中将行尾规范化为LF 并且,还可以选择在签出文件时将其转换为CRLF

如果您只是想在工作目录中有CRLF行结尾 无论使用哪个存储库,都可以设置 在不使用任何属性的情况下配置变量“core.autocrlf”

[core]autocrlf=true这不会强制文本标准化 文件,但确保您介绍给 存储库将其行结束符规范化为LF 已添加,并且已在存储库中规范化的文件 保持正常

和下线:

此属性设置要在中使用的特定行尾样式 工作目录。它支持行末转换,而无需任何 内容检查,有效地设置文本属性

设置为字符串值“crlf”此设置强制Git规范化行 签入时此文件的结尾,并在 文件已签出

设置为字符串值“lf”此设置强制Git规范化行 签入时以LF结尾,并防止在文件 已经结帐了

与crlf属性向后兼容 为了向后兼容,crlf属性解释如下:

crlf文本

-crlf-文本

crlf=输入下线=lf

看起来两者都在做同样的事情,但是关于
兼容性
。这是否意味着
autocrlf
已被弃用,而新的风格是
eol
或其他什么?我目前有一个存储库,其中包含多个损坏的文件,我希望将其转换为
crlf
表示。你看,文档让我们困惑,而不是澄清问题


在这种情况下,我应该应用什么?

与其直接回答问题本身,不如看看链接的问题,让我们集中精力:

我目前有一个存储库,其中包含多个损坏的文件,我希望将其转换为crlf表示

首先,请注意,这些选项都不能更改任何现有的提交。这是Git的一个基本属性:一旦提交,就不能修改现有的提交。您可以做的是进行新的提交。这通常没什么大不了的,因为我们通常只希望新的内容是正确的(但请参见
git filter branch
,它在对内容应用过滤器后复制提交,并可用于重新复制整个存储库:新的repo不再与旧的repo兼容,但您可以通过这种方式“修复历史记录”)

接下来,我认为这是理解所有这些结束行/CRLF属性选项的关键:转换在文件移入或移出索引时应用于文件。

记住,Git的索引是构建下一次提交的地方。索引的内容最初与当前提交的内容相同:例如,运行
git checkout master
,git将名称
master
解析为提交ID,并将特定提交复制到工作树中,但副本通过索引

换句话说,Git首先发现文件
foo.txt
在提交中(需要提取)。因此Git将该版本的
foo.txt
移动到索引中。索引的版本与
HEAD
commmit的版本完全匹配。Git不会对索引版本应用任何过滤器,也不会更改任何行尾

更新索引版本后,Git会将该版本的文件从索引复制到工作树中。1在提取过程中,现在会进行一些转换。如果有污迹过滤器,Git现在就应用它。如果要进行行尾转换,Git现在就应用这些转换

在此过程中,工作树文件可能与索引版本不同。现在Git有一个问题,因为现在文件是“脏的”(在工作树中修改)。这就是事情变得特别混乱的地方,尽管大多数时候,这里的细节是看不见的

最后,在使用工作树之后,您可以在某个文件路径名上运行
git add
(或者使用
git add-a
或其他任何方法来添加许多文件)。这会将文件从工作树复制到索引中。2在复制过程中,还会发生更多的转换:如果有一个干净的过滤器,Git会立即应用它。如果要进行行尾转换,Git现在就应用它们

换句话说,在添加这些文件之后,索引版本可能与工作树版本不匹配。但是,Git仍然将索引版本标记为“匹配”。git状态将跳过工作树版本,因为git现在声明索引版本与工作树版本匹配。有点像,因为索引版本与再次运行
git add
时将添加的内容相匹配

实际实现使用时间戳,通常分辨率为1秒。Git将继续相信索引版本与工作树版本匹配,除非操作系统触及文件工作树版本上的时间戳。即使更改要应用的过滤器集和/或行尾转换,这也是正确的。Git没有意识到您已经改变了行尾的工作方式,或者更改了“clean”过滤器来做一些不同的事情:它只是看到索引的“cache”方面显示“I match work tree version time stamp t”。只要工作树版本的时间戳仍然是T,文件就必须是“干净的”

因此,要更新这些