为什么git-status显示更新的二进制文件,并将新名称作为重命名?

时间:2012-11-15 17:07:25

标签: git binaryfiles

当处理二进制文件时,git似乎考虑用另一个文件替换一个文件,修改后,重命名文件。这发生在例如用foo-1.0.3.jar或以下测试用例替换foo-1.0.1.jar时:

$ dd if=/dev/urandom of=test.dat bs=1024 count=10
$ md5sum test.dat
8073aef704e9df13b44818371ebbcc0b  test.dat
$ git add test.dat && git commit -m 'add binary file'
$ mv test.dat test2.dat
$ git rm test.dat
$ dd if=/dev/urandom of=test2.dat bs=1 count=1 conv=notrunc
$ md5sum test2.dat
21e1ac3ab9ba50c9dad9171f9de7232d  test2.dat
$ git add test2.dat

现在我显然有一个包含新内容(至少部分)和新名称的文件。但是,git认为这是git status中的重命名:

$ git status
# On branch master
# Changes to be committed:
#   (use "git reset HEAD <file>..." to unstage)
#
#       renamed:    test.dat -> test2.dat
  • 这是什么原因,例如:这两个文件有多相似?如果test2.dat包含完全不同的数据,似乎不会发生。
  • 除了看起来有些尴尬之外,它有什么缺点吗?实际数据似乎非常好;在检查以前的版本时,我会获得该版本的正确文件。

1 个答案:

答案 0 :(得分:4)

Git实际上并不存储重命名,它只存储一个新树,其中一个文件已删除,另一个文件已添加。比较树的Git命令(git diffgit loggit status)会根据内容检测重命名。

由于某种原因,重命名检测会触发您的文件。如果你已经耗尽了/dev/urandom中的熵,那么它们的内容可能相似吗?

编辑:参见例如有关重命名检测的详细信息,请How does git detect similar files, for its rename detection?