为什么不在.gitattributes中尊重eol = crlf

时间:2016-02-10 13:01:56

标签: git

所以我决定在我们的git repo中转换所有带有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 个答案:

答案 0 :(得分:3)

经过几个小时的尝试(并且失败)找到.gitattributes格式的良好规范我决定尝试以下(注意这不是问题的正确解决方法):

*.bat     -text

而且,请注意,批处理文件从git status消失,表明文件的语法没有问题,正如我最初假设的那样。虽然我不希望将批处理文件视为二进制文件,但这使我得到了我现在认为正确的结论:

在使用text属性标记文件时,我误解了git实际上做了什么。它始终在内部存储具有LF行结尾的文件,并且仅在结帐时转换为CRLF。所以我的初步步骤是完全正确的,他们只是产生输出,让我困惑,认为出了问题。文件实际上已经改变了;以前它们是用CRLF存储的,但现在它们只存储在LF行结尾,这将在结账时更正。