2009-11-22 49 views
49

git如何快速檢測文件修改?git如何檢測文件已被修改?

是否散列回購中的每個文件並比較SHA1?這需要很長時間,不是嗎?

還是比較atime,ctimemtime

+0

對於不同的平臺可能會有所不同。我特別感興趣的是Git/Windows怎麼做 – Pacerier 2014-10-20 10:53:40

回答

3

那麼我會冒險猜測它使用stat()調用的組合來計算看起來可能已經改變了什麼,然後反過來實際上使用它的差異引擎來確定是否確實如此。

你可以看到差異引擎here的代碼來得到一些想法。我追溯了代碼庫,以確保狀態命令確實調用了這個代碼(看起來像很多東西!),實際上,當你知道Git在Windows上執行得非常糟糕時,這一切都很有意義它使用仿真層來執行這些POSIX類型的調用:在該平臺上執行git status的速度要慢一個數量級。

無論如何,缺少從上到下閱讀所有的代碼(如果我有時間的話,我可能會遲一些!),就我現在可以帶你...也許有人可以是更明確的,如果他們已經工作與代碼庫。

注意:另一種可能的加速來自於明智地使用inline函數,您可以在頭文件中清楚地看到它。

[編輯:見herestat()解釋]

+0

關心解釋'stat()'是什麼? – hasen 2009-11-22 15:42:46

+0

@hansen j:更新時參考了stat()手冊頁。 – jkp 2009-11-22 22:47:49

6

有像「混帳地位」的報道最初的mtime檢查,但是當最終提交計算,mtimes並不重要......它是重要的SHA1。

+1

@Randal:我不認爲這是真的,它總是做一個差異:http://gist.github.com/240775。如果只有mtime被用於'git status',你會看到我所做的修改。 – jkp 2009-11-22 22:52:00

+2

@jkp我自己的straceing顯示不變的worktree文件只對他們完成「lstat」。 – Tobu 2010-11-03 22:23:14

2

根據平臺,您應該能夠找出Git使用哪些系統調用來確定其狀態。嘗試在Linux上使用strace git status,在SunOS上使用truss git status,或者在Mac OS X上使用開發人員工具看似基於DTrace的工具。

28

Git努力從lstat()值中確信工作樹匹配索引,因爲回落文件內容非常昂貴。

Documentation/technical/racy-git.txt描述了什麼樣的stat字段被使用,以及如何避免一些由於低mtime粒度造成的競爭條件。 This article has some more detail

stat值不防篡改,請參閱futimens(3)。 Git可能會被愚弄到丟失對文件的更改;這不會損害內容散列的完整性。

+1

但是每個提交都會回退到文件內容上嗎?還是在猜測,即使在提交? – Pacerier 2014-10-20 10:54:25