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,文件就必须是“干净的”
因此,要更新这些