2012-11-15 37 views
5

當處理二進制文件時,git似乎考慮用另一個文件替換文件,修改文件重命名。這發生在例如以foo-1.0.3.jar或與下列測試用例替換FOO-1.0.1.jar時:爲什麼git-status將更新的二進制文件顯示爲重命名的新名稱?

$ 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 status重命名:

$ git status 
# On branch master 
# Changes to be committed: 
# (use "git reset HEAD <file>..." to unstage) 
# 
#  renamed: test.dat -> test2.dat 
  • 什麼是這種情況的原因,例如這兩個文件有多相似?如果test2.dat包含完全不同的數據,它似乎不會發生。
  • 除了看起來有點尷尬外,它有什麼缺點嗎?實際數據似乎非常好,當檢查出以前的版本時,我會得到該版本的正確文件。

回答

4

Git實際上並不存儲重命名,它只是存儲一個新的樹,其中刪除了一個文件並添加了另一個文件。比較樹的Git命令(git diffgit loggit status)根據內容檢測重命名。

由於某種原因,重命名檢測會觸發您的文件。如果你在/dev/urandom中已經耗盡了熵,那麼它們的內容可能相似?

編輯:參見例如有關重命名檢測的詳細信息,請參閱How does git detect similar files, for its rename detection?

+0

不,它並不總是成功的二進制文件。 test.dat被重命名爲test2.dat,然後添加了新的內容。 Git說它被重新命名,因爲它已被重命名(和更新)。 – jamessan

+1

@jamessan:git不知道我使用了'mv'和afaik它不檢查inode數字。該git不存儲重命名是正確的,但。 – ThiefMaster

+0

哦,對了,我沒有注意到'notrunc'! – opqdonut

相關問題