Git认为未删除的文件被删除然后添加

时间:2015-05-18 04:05:54

标签: git

在一个未受影响的文件中,git认为该文件已被删除然后再添加回来。我无法弄清楚原因。

就git而言,症状可以显示如下:

$ git diff-index --cached HEAD
:000000 100644 0000000000000000000000000000000000000000 8d1b41aeb85f3c2afc6e70e824902f3f365e416c A  myfile.h
:100644 000000 8d1b41aeb85f3c2afc6e70e824902f3f365e416c 0000000000000000000000000000000000000000 D  myfile.h

这对我来说很陌生。文件的校验和是相同的,文件的模式是相同的,但git仍然认为删除文件有一个更改,然后添加文件的更改,这是在索引和工作目录之间!

git status说

Changes to be committed:
  (use "git reset HEAD <file>..." to unstage)

  modified:   myfile.h

但是使用git reset HEAD myfile.h什么都不做,git checkout myfile.h也没有。物理删除文件并再次创建它也无法解决问题。

git reset --hard摆脱了这个问题,但在很多情况下,如果发生这种情况,就像在rebase中间一样,这不是一个选择。

在这种情况下,我也可以执行以下操作:

$ git rm --cached myfile.h
rm 'myfile.h'
$ git status
Changes to be committed:
  (use "git reset HEAD <file>..." to unstage)

        deleted:    myfile.h

Untracked files:
  (use "git add <file>..." to include in what will be committed)

        myfile.h

$ git add myfile.h
$ git status
Changes to be committed:
  (use "git reset HEAD <file>..." to unstage)

        modified:   myfile.h

$ git diff
$

我想弄清楚为什么git认为这个文件被删除并添加了,但我不确定在哪个方向上进行调查。我如何向git询问关于它对我的索引的看法的更多信息,以便我可以弄清楚它为什么要删除/添加这个未更改的文件呢?

更新: 我还没有找到原因,但我有更多的信息要分享。 我试图比较引用git报告差异的情况的git树对象和不报告差异的情况。 事实证明,有问题的文件的父目录上的git ls-tree在一个帐户上看起来不同:文件的顺序。

100644 blob e79f590c93e9a971c9c443558f35067898d2587f myeee.h
100644 blob 8d1b41aeb85f3c2afc6e70e824902f3f365e416c myfile.h
040000 tree a9091c79f0d317f1d0ea596e538b50afde4b6251 myfile
100644 blob 47925e1b444f396a038052dc583310dc3a6b6021 myfile_again.h

100644 blob e79f590c93e9a971c9c443558f35067898d2587f myeee.h
040000 tree a9091c79f0d317f1d0ea596e538b50afde4b6251 myfile
100644 blob 8d1b41aeb85f3c2afc6e70e824902f3f365e416c myfile.h
100644 blob 47925e1b444f396a038052dc583310dc3a6b6021 myfile_again.h

这似乎是git看到的差异的根源......但我仍然不知道为什么会看到不同的东西。

0 个答案:

没有答案