这很容易导致 git 存储库不一致:
如果提交的文件以 crlf 行结尾且工作树中未设置文本属性,但在存储库中设置了文本属性,则该文件将错误地显示为已修改。
我在 Mac (Darwin 13.1.0) 上使用 Git 1.8.5 重现此内容core.autocrlf
设置为假。
效果和这个问题是一样的:Git 文件在签出、重置 --hard 等后修改,即使 autocrlf 设置为 false https://stackoverflow.com/questions/15684197/git-files-modified-after-checkout-reset-hard-etc-even-though-autocrlf-is-se
您所要做的就是签入一个以 CRLF 行结尾的文件,在本地使用该文件的 git 属性设置与存储库中不同。
这个小 shell 脚本将通过几个简单的步骤从一个干净的存储库开始生成一个不一致的 git 存储库。
#!/bin/bash
# creating a git repo "repo"
rm -rf repo
mkdir repo
cd repo
git init
# committing gitattributes with text attribute set for all files
echo "* text" > .gitattributes
git add .gitattributes
git commit -m "added .gitattributes"
# add a file with CRLF line ending with text attribute unset
echo -e "crlf\r" > crlffile
echo "* -text" > .gitattributes
git add crlffile
git commit -m "added crlffile"
git checkout .gitattributes
# now "crlffile" shows as modified, even though it isn't.
# only way to resolve is to modify .gitattributes
git status crlffile
# crlffile shown as modified.
git checkout crlffile
git status crlffile
# crlffile shown as modified.
git reset --hard
git status
# crlffile shown as modified.
# git diff will report the CR as the difference
git diff
# but external diff reports no differences.
git difftool --extcmd=diff --no-prompt
这个问题的实际原因是我经常在 Windows 上使用 msysgit 遇到同样的问题(使用core.autocrlf
设置为假)。似乎 egit 用户按照此处描述的方式使用 eclipse 提交文件,但我尝试了解该错误是由 git 还是 egit 引起的。
其他 git 用户能否尝试在其他平台/版本上复制该问题并确认/否认这是一个 git bug?
EDIT:
如果您认为这个问题在其他地方已经有了答案,我有兴趣听到答案。 “git 属性导致问题”对于这个问题来说还不够准确。如果它是 git bug 的解决方法,则应将其声明为解决方法。