我遇到了一个文件问题,这些文件在新的git克隆后被视为已修改
- 除
*.txt
文件应具有eol=CRLF
外,所有文本文件均应具有eol=LF
以下是.gitattributes
的外观:
* text=auto
*.txt text eol=crlf
*.png binary
*.jpg binary
*.bmp binary
以下是我的测试:
- 带有2.txt文件的新repo(LF.txt和CRLF.txt)
LF.txt
:eol=LF(整个文件的行尾为LF
)CRLF.txt
:eol=CRLF(整个文件的行尾为CRLF
)
- 添加、提交、推送
- 添加
.gitattributes
(包含上述内容):git add .gitattributes
,提交,推送 - repo的新克隆
LF.txt
:eol现在是CRLF
(如预期)CRLF.txt
被视为已修饰,即使它仍然具有作为eol的CRLF
- 带有2.txt文件的新repo(LF.txt和CRLF.txt)
LF.txt
:eol=LFCRLF.txt
:eol=CRLF
- 添加、提交、推送
- 添加
.gitattributes
(具有上述内容):git add --renormalize .
CRLF.txt
被认为是经过修饰和阶段性的(但没有内容差异,eol仍然是CRLF
).gitattributes
仍未被追踪
- 轨道
.gitattributes
:git add .
- 提交并推送
- repo的新克隆
LF.txt
:eol现在是CRLF
(如预期)CRLF.txt
:eol为CRLF
(如开头所示)- 回购是清白的
其他信息
- 操作系统:Windows 10
- git版本:2.20.1.windows.1
问题
- 测试1:为什么CRLF.txt被视为在新克隆后被修改
- 测试2:
git add --renormalize .
实际在做什么?为什么它不上演.gitattributes
- 在已经有一些历史记录的存储库中设置
.gitattributes
时,是否建议运行git add --renormalize
以避免在新克隆后修改文件
测试1:为什么CRLF.txt在新克隆后被视为已修改?
因为你对git撒谎了:你告诉git,你的存储库中CRLF.txt
的行尾是Unix风格(LF)的行尾,但你希望工作文件夹中的Windows风格(CRLF)行尾。这就是text
属性的含义:规范化行尾,使它们在存储库中具有Unix风格的行尾。
但是您的第一步是将带有Windows样式行结尾的文件添加到存储库中。
因此,git可以查看磁盘上的文件,将其Windows风格(CRLF)的行尾转换为普通形式(Unix风格的LF行尾),并将结果与存储库中的结果进行比较。
这些内容不匹配。因此,它认为您已经修改了文件这就是重新规范文件的原因。
测试2:什么是git-add——重整化。真的在做什么?
它会更新文件以匹配您在.gitattributes
中声明的内容。添加.gitattributes
时,不会更改磁盘或存储库中文件的内容。但您可能正在(在这种情况下正在)更改您对存储库中内容存在方式的声明。
如果存储库中的内容实际上并不是您所声称的,那么git add --renormalize
将对此进行更正。
为什么它不同时展示.gitattributes?
重新规范化只影响存储库中已经存在的文件,它将"新的‘清理’过程应用于所有跟踪的文件,以强制将它们再次添加到索引中。"(来自git文档;重点是我的。)
因此,它确实只对现有内容进行了重整。
在已经有一些历史记录的repo中设置.gitattributes时,是否建议运行git add--renormalize以避免在新克隆后修改文件?
是。