Git本身試圖成爲內容形式不可知論者。也就是說,第一個近似值只關心原始數據 - 甚至不包括文本與二進制數據,只是「這裏是一些數據作爲文件集合;請將其存儲爲」。 (我認爲,Linus的原始視覺並沒有包含CR/LF轉換,只要從未打開,它不會損壞二進制數據。)
這種不可知論會迅速崩潰。比較一次提交與另一次提交是通過比較文件開始的,但超出了簡單化的「提交A中的路徑名p/a/t/h必須與提交B中的路徑名p/a/t/h相同」 - 當兩個路徑存在和做名稱相同的內容,我們很快就發現,我們需要比較相似,但並非完全相同的文件,並希望在某種結構基礎的這樣做:線或字爲本diff
,例如。而且,要處理重命名問題,如果p/a/t/h
變成p/t/h
或反之,我們可能希望將這些文件相互匹配,即使它們只有90%相似。 (其他VCS通過記錄目錄操作或通過爲文件分配唯一的內部ID來記錄其他類型的文件標識,而不僅僅是路徑名,每個提交都可以通過記錄目錄操作或GIT不分配,所以它必須依賴於。這種相似性檢測系統Git的相似性檢測奇特:它不是相當的線定位,以便它可以在二進制文件的工作,但它確實檢測線邊界,以消除\ r \ N隨其相似性檢測\ n轉移)
。
無論如何,你當然可以可以採取Git並修改它添加新的對象類型,是「像樹木」,但具有不同的味道。這將讓你挑選這些結構化文件。它的工作原理似乎基本上是一個研究課題。儘管如此,只要在中將它們阻塞爲樹木顯然不能很好地工作,但是:如果某個樹實例是「派生樹」或「真正樹」,則永遠不會知道。爲了避免更改某些Git的核心代碼,可以在Git讀寫其索引的位置插入實際與派生/合成樹的轉換,並將「真實」與「合成」編碼到「文件名」中。
如果存儲在每個合成子樹中的原始數據本身是二進制的,那麼您將遇到常見的頭痛,即差異不可用。包文件存儲格式(基於xdelta)不是面向行的,但使用路徑名稱的包啓發式可能無法很好地執行,因此您可能也要修改這些格式。從xdelta獲得的壓縮量取決於輸入數據中的Shannon entropy:除了典型的文本輸入具有相當低的熵之外,二進制文本與文本實際上不是問題,二進制輸入往往不太可預測。
謝謝 - 不知何故,我覺得我最終會付出更多努力而不是獲得... –