2015-04-23 56 views
6

Git使用什麼算法來確定某個文件是否被重命名?Git如何知道該文件已重命名?

這是什麼git status之前生產的僅有幾分鐘的路程:

enter image description here

劃有黃色方格信息是不正確。實際上沒有這種重新命名。文件views/file/create.phpviews/file/index.php在完全新建的兩個文件後半小時真正刪除 - views/logo/create.phpviews/logo/index.php已創建。這兩個文件集可能看起來(與Git)頗爲相似,但事實依然如此 - 這些都不一樣,重命名文件。這是一組全新的文件,在刪除第一組文件之前大約半小時在不同的目錄中創建。

由於Git提供的信息不正確,我想養活我的好奇心,這就是爲什麼我問。

+0

我同意Flosculus,只是想添加[this](http://fabiensanglard.net/git_code_review/diff.php)文章,將相關檢測中使用的算法加入一些細節。 – wonderb0lt

+1

不錯!在2-3分鐘內提出四個提議和一個明星,在一個問題上,這是一個完美的欺騙! :>我只是喜歡SE社區。還有...哎呀...對不起,作爲那個傻瓜的作者,但我的谷歌只是充滿了冷咖啡! – trejder

回答

6

Wikipedia

命名重命名的處理方式隱含而不是明確。對CVS的一個常見的 投訴是它使用文件的名稱來標識其修訂歷史記錄,因此如果沒有 或者中斷其歷史記錄,或者重命名歷史記錄以及由此 使歷史記錄不準確,則移動或重命名文件是不可能的。大多數後CVS修訂控制系統 通過給文件一個獨特的長壽命名稱(一種inode 數字)來解決這個問題,該名稱在重命名後仍然存在。 Git沒有記錄這樣一個標識符,這被認爲是一個優點。[34] [35]源代碼 文件有時會被拆分或合併以及簡單地重命名,[36]和 將此記錄爲簡單的重命名將凍結關於(不可變)歷史記錄中發生的事件的不準確的 描述。通過在瀏覽快照歷史記錄時檢測重命名而不是在創建快照時記錄它,Git通過檢索重命名地址 [37]。 (簡而言之,給定 修訂版N中的文件,修訂版N-1中具有相同名稱的文件是其 默認祖先,但是,當 修訂版N-1中沒有類似命名的文件時,Git會搜索文件只存在於修訂版 N-1中,與新文件非常相似)但是,每次查看歷史記錄時,需要更多的CPU密集型工作,並且需要 的選項來調整啓發式。這種機制並不總是 工作;有時會將同一提交 中的更改重命名的文件讀取爲刪除舊文件並創建新文件。 開發人員可以通過提交重命名 並單獨更改來解決此限制。

相關問題