为什么git认为未更改的文件的每一行都已更改

时间:2014-12-12 06:38:54

标签: git

我不认为这是一个行结束差异问题 - p4merge认为文件中没有任何变化,即使设置为识别行结尾和空白区域差异。

我的问题是有时会发生以下情况:

  • 首先git status显示没有未提交的更改。
  • 然后我结帐另一个分支
  • 现在git status列出了一些已更改的文件。
  • git diff关于其中任何一个"更改过的文件"显示文件的每一行都已更改。更改后的版本与原始版本相同。

为什么会这样?为什么git认为文件已经改变,当它们似乎没有这样做?为什么只检查另一个分支导致这个?

我的第一个想法是行结尾,但我不知道为什么p4merge不会检测到那些。第二个想法是文件模式的改变。我不知道如何确定是否属实。 git config --list显示core.filemode设置为false。 git config --global --listgit config --system --list没有显示core.filemode的任何设置(我在这里告诉我,因为我不确定不同的配置级别如何相互覆盖)。 core.autocrlf设置为true。

多个开发人员提交到同一个存储库,我在Windows计算机上提取所有更改。我猜某个地方的人有某种设置导致了这种情况,但我不知道它是在我当地还是其他人,或者它可能是什么设置。< / p>

列为已更改的文件似乎不是随机的 - 如果我删除了我的本地存储库,则从远程克隆(默认为要检出的主分支)再次克隆它,并再次检出该分支{ {1}}每次都会列出与更改完全相同的文件。这些文件有时是最近编辑过的,有时是多年未触及过的文件。它们不仅是二进制文件(已知git status有时会损坏),还有文本文件。

执行core.autocrlf=true后跟git rm --cached -r .的命令可以消除这些变化,但它经常发生变得令人烦恼。我也很好奇是什么导致了这一点。

同一个存储库也会导致行结束问题。我认为这是一个单独的问题,所以我可能最终会提出另一个问题,但我在这里简要地提到它,以防它毕竟是相关的。签出另一个分支或从远程存储库中提取更改有时会导致文件显示为已更改,并且这些文件上的git reset --hard仅输出git diff

编辑:存储库的.gitattributes文件只有行warning: LF will be replaced by CRLF in [file]. The file will have its original line endings in your working directory.,其中没有其他内容。

* text=auto的输出(包括颜色,编辑器的文件路径,远程,difftool,用户名和电子邮件等等的省略设置):

git config --list

1 个答案:

答案 0 :(得分:5)

显示这样的&#34;隐形&#34;细节变化使用:

git diff --word-diff-regex=.

这将标记所有已更改的字符,甚至是空格。

很可能它会显示行结尾的变化。如果您正在使用Windows并打开core.autocrlf,git可能会期望其他类型的行结束并显示&#34;错误&#34;以diff结尾的行。

通过关闭core.autocrlf告诉git不关心行结尾应该解决您的问题。