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

rik*_*eri 5 git

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

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

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

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

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

多个开发人员提交到同一个存储库,我在Windows机器上提取所有更改.我猜某个某个地方有某个设置导致了这个问题,但我不知道这是我本地人还是其他人,或者它可能是什么设置.

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

git rm --cached -r .接下来执行的命令git reset --hard可以消除这些变化,但它经常会发生变得令人烦恼.我也很好奇是什么导致了这一点.

相同的存储库也导致行结束问题.我认为这是一个单独的问题,所以我可能会最终提出另一个问题,但我在这里简要地提到它,以防它毕竟是相关的.检出另一个分支或从远程存储库中提取更改有时会导致文件显示为已更改,并且git diff这些文件仅显示输出warning: LF will be replaced by CRLF in [file]. The file will have its original line endings in your working directory.

编辑:存储库的.gitattributes文件只有行,* text=auto而没有其他内容.

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

core.symlinks=false
core.autocrlf=true3
pack.packsizelimit=2g
rebase.autosquash=true
merge.summary=true
core.repositoryformatversion=0
core.filemode=false
core.bare=false
core.logallrefupdates=true
core.symlinks=false (yes this is there twice, just noticed)
core.ignorecase=true
core.hidedotfiles=dotgitOnly
Run Code Online (Sandbox Code Playgroud)

mic*_*has 5

要在细节中显示这种"隐形"变化,请使用:

git diff --word-diff-regex=.
Run Code Online (Sandbox Code Playgroud)

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

最有可能它会显示行结尾的变化.如果你在Windows上工作并打开core.autocrlf,git可能会期望另一种行结束并显示以"diff"结尾的"错误"行.

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