我对新的git克隆后被修改的文件有疑问。
eol=LF
,但*.txt
文件应具有eol=CRLF
。 .gitattributes
的外观如下:
* text=auto
*.txt text eol=crlf
*.png binary
*.jpg binary
*.bmp binary
这是我的测试:
LF.txt
:eol = LF(整个文件的行尾是LF
)CRLF.txt
:eol = CRLF(整个文件中的行尾为CRLF
).gitattributes
(具有上述内容):git add .gitattributes
,提交,推送LF.txt
:eol现在CRLF
(如预期)CRLF.txt
被视为已修改,即使它仍然具有CRLF
作为eol LF.txt
:eol = LF CRLF.txt
:eol = CRLF .gitattributes
(具有上述内容):git add --renormalize .
CRLF.txt
被视为已修改和上演(但没有内容差异,并且eol仍为CRLF
).gitattributes
仍未跟踪.gitattributes
:git add .
LF.txt
:eol现在CRLF
(如预期)CRLF.txt
:eol是CRLF
(与开头一样)git add --renormalize .
实际在做什么?为什么还不登台.gitattributes
?.gitattributes
时,建议运行git add --renormalize
以避免新克隆后修改文件吗?答案 0 :(得分:2)
测试1:为什么在新克隆后CRLF.txt被视为已修改?
因为您撒谎了git:您告诉git,您存储库中CRLF.txt
的行尾是Unix风格(LF)的行尾,但是您想要Windows风格(CRLF)的行尾在您的工作文件夹中结尾。这就是text
属性的含义:标准化行尾,以便它们在存储库中具有Unix样式的行尾。
但是您的第一步步骤是将具有Windows样式的行尾的文件添加到存储库中。
因此,git可以查看磁盘上的文件,将其Windows样式(CRLF)行结尾转换为常规形式(Unix样式LF行结尾),然后将结果与存储库中的内容进行比较。
这些内容不匹配。因此,它认为您已经修改了文件。 那是您重新规范化文件的原因。
测试2:什么是git add --renormalize。实际在做什么?
它将更新文件以匹配您在.gitattributes
中声明的内容。添加.gitattributes
时,并没有更改磁盘上或存储库中文件的内容。但是,您可能(在本例中为 )正在更改关于内容在存储库中存在方式的声明。
如果存储库中的内容 实际上不是您声明的内容,那么git add --renormalize
会对此进行纠正。
为什么它也没有登台.gitattributes?
重新规范化仅影响存储库中已存在的文件,它对“ 所有跟踪的文件新鲜应用'干净'过程,以将其再次强制添加到索引中”。 (摘自git文档;重点是我的。)
因此,它实际上只能重新标准化现有的 内容。
在已具有一定历史记录的回购中设置.gitattributes时,是否建议运行git add --renormalize以避免新克隆后修改文件?
是的