为什么 .gitattributes 中的 eol=crlf 无法生效?

5

所以我决定将我们git仓库中所有带有Windows风格换行符的文件转换为Unix风格的换行符。

我按照http://www.git-scm.com/docs/gitattributes#_end_of_line_conversion中的说明进行操作:

echo "* text=auto" >>.gitattributes
rm .git/index     # Remove the index to force Git to
git reset         # re-scan the working directory
git status        # Show files that will be normalized
git add -u
git add .gitattributes
git commit -m "Introduce end-of-line normalization"

我后来意识到,这也改变了应该保留CRLF的*.bat文件。我尝试使用以下.gitattributes文件再次进行整个过程:

# Default 
*         text=auto eol=lf

# Windows-only files
*.bat     text eol=crlf

这似乎并没有改变git status的输出结果,批处理文件仍然被标记为“已更改”,即使它们在我的工作副本中是CRLF格式,而.gitattributes已经将它们设置为这样。看来git只是忽略了带有*.bat的那一行。使用git show --raw还向我展示了该文件现在存储为LF而不是CRLF。

1个回答

6

在试图(并且失败)寻找有关.gitattributes格式的良好规范数小时后,我决定尝试以下方法(请注意,这不是解决问题的正确方法):

*.bat     -text

咦,批处理文件从git status中消失了,这表明文件的语法没有问题,这是我最初的假设。虽然我不想让批处理文件被视为二进制文件,但这让我得出了正确的结论:

我误解了git在将文件标记为text属性时实际执行的操作。它始终在内部使用LF换行符存储文件,并仅在检出时转换为CRLF。因此,我的初始步骤完全正确,只是产生了混淆输出,使我认为有问题。这些文件实际上已经发生了更改。以前它们使用CRLF存储,现在它们将只使用LF换行符存储,在检出过程中将进行更正。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接