2009-09-21 30 views
7

任何人都可以給我一些想法,爲什麼Git的開發做了一個設計決定來存儲文件(斑點)的內容,所以當內容變化的新斑塊的Git的設計決策需要創建?上存儲的內容,而不是差異

我相信顛覆賣場的修訂,而不是內容,所以當內容發生變化,它只是跟蹤兩者之間的差異。不能這樣做也是這樣嗎?存儲內容而不是修訂版有什麼好處?

+0

「混帳開發商」是Linus Torvalds。不是開發者** s **。 – 2009-09-21 07:48:35

回答

11

我無法找到一個快速谷歌的答案,但我相信它歸結爲一個簡單的「不要緊「的原因磁盤空間很便宜」。一個源代碼管理工具內

存儲修改是棘手的。如果您只存儲了之前版本和當前版本之間的差異,則最終出現兩個問題:

  1. 返回最新版本(常見情況)需要最多的工作,因爲代碼需要組裝該版本通過結合每一個修訂。
  2. 任何錯誤(比如磁盤故障)到一個版本腐化訪問每個以後的修訂版。

我相信大多數現代VCS實際存儲最新版本(出於性能方面的原因),如果使用差異,則用於回溯,而不是轉發。

+0

謝謝!具有很大的意義。 – chibicode 2009-09-21 04:40:21

+0

Git也有'packed'格式,它以大小變化的形式存儲大部分對象。新近度順序(最近的對象作爲delta的基礎)是首選(但不是強制執行)。 – 2009-09-21 07:47:38

5

解決此(及相關)問題的文章是Repository Formats Matter。這是影響我的決定轉移到前Git的幾年的文章之一。這裏是摘錄:

鑑於這個說法,應該很清楚我認爲git的存儲庫結構比其他的要好,至少對於X.org的使用模式來說。它似乎舉行了一些有趣的特性:

  1. 對象包含數據的文件決不會被修改。一旦寫入,每個文件都是隻讀的。

  2. 壓縮是離線完成的,可以延遲到主對象保存到備份介質之後。該方法比任何增量方法提供更好的壓縮,允許在磁盤上重新排序數據以匹配使用模式。

  3. 對象數據本質上是自我檢查;第一次引用對象時,無法修改存儲庫中的對象並轉義檢測。

4

讓我清楚你的誤解:

任何人都可以給我一些想法,爲什麼Git的開發做了一個設計決定來存儲文件(斑點)的內容,所以當內容需要創建一個新的blob嗎?

相當不錯(初始)Git的設計的解釋可以在湯姆·普雷斯頓·沃納的The Git Parable文章(除一個在Greg Hewgill answer鏈接)中找到。

其背後的想法是,通常(在足夠大的項目)在新版本只有少數文件出大量的項目變更的文件,所以只存儲不同版本的文件內容節省空間。這是相同想法Subversion利用其「山寨」技術(它使用hardlinking,IIRC)。 (或更準確地說,git倉庫數據庫中的每個對象都被壓縮,包括comit對象)。這些文件的內容是zlib(deflate)壓縮的

我相信顛覆賣場的修訂,而不是內容,所以當內容發生變化,它只是跟蹤兩者之間的差異。不能這樣做也是這樣嗎?存儲內容而不是修訂版有什麼好處?

我不明白你想在這裏說什麼。

如果是存儲差異節省空間,那麼我想告訴你,除了'鬆散'格式(其中每個blob,即文件的每個(不同)內容都存儲在單獨的文件中.git)也「打包」格式,許多對象存儲在deltaified形式,使用二進制增量從LibXDiff庫。

這種格式是爲網絡傳輸創建(大磁盤空間可能是便宜,但帶寬不是),並被改編成也磁盤格式。這種格式非常高效,即使不是最有效的版本控制系統格式,也是更高效的一種格式,從而使git存儲庫更小,或是不同版本控制系統中最小的一個。根據情況Git代碼庫的完整克隆(其中包含完整的歷史記錄)可能比相當於顛覆結賬較小(其中包含原始變化額外的副本,以便svn diffsvn status工作,而不需要對網絡進行傳輸,以合理的速度)。

這種設計('鬆散'和'打包'格式)具有非常高效的打包優勢,但有缺點,您必須使用「git gc」手動重新打包(不適用於磁盤空間,但性能 - 磁盤I/O);現在大多數git命令都會在需要時重新安裝庫(安全地)。這使得關於「鬆」格式設計決策

+0

非常有趣。 +1 – VonC 2009-09-21 08:19:36

+0

謝謝,我認爲我對Subversion的「廉價複製」技術是如何工作的理解很差。爲了澄清,讓我們說一個在svn控制下的目錄有文件A,B,C。現在,假設我複製這個目錄並把這個新目錄放在svn下。現在讓我們說我把A換成A'。我相信顛覆現在會在回購中存儲A'的內容。它是否正確? (我之前在考慮顛覆者會存儲A和「diff A A」,我認爲這是不正確的......) – chibicode 2009-09-22 10:45:45

+0

實際上,顛覆似乎存儲了A和diff AA'(http:/ /subversion.tigris.org/design.html)。所以,千萬不要介意以前的評論... – chibicode 2009-09-22 10:53:24

相關問題