2017-09-14 33 views
0

由於許多文件格式有一個樹狀結構(如XML,焦油,如果你考慮分拆標籤和幀間隔爲葉子甚至MP3),我想知道是否有什麼辦法可以讓混帳它們存儲爲樹對象,而不是斑點,利用結構,例如用於區分和合並。如何將文件保存爲git樹而不是blob?

到目前爲止,我已經用鉤或污跡/清潔過濾器考慮,但都有,我想避免的缺點:

  • 使用乾淨的過濾器,只重寫BLOB(即文件內容),我可以並行創建一棵樹並用足夠的信息替換blob,以便在結帳時爲污跡過濾器重新創建原始文件。然而,這將使git status要求「目錄」樹內部表示丟失了,有會是一個佔位符文件,該文件可能會阻止添加
  • 使用同一個名字的樹post-commit鉤子將陷入困境與git diff等很多

那麼有什麼明智的方式來實現這一目標嗎?或者我應該堅持blob並可能修改merge/diff驅動程序?

回答

1

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:除了典型的文本輸入具有相當低的熵之外,二進制文本與文本實際上不是問題,二進制輸入往往不太可預測。

+0

謝謝 - 不知何故,我覺得我最終會付出更多努力而不是獲得... –

-1

如果你想在Git中添加任何二進制文件(如XML,焦油,MP3),它們將被區別對待。

Git是指對非二進制文件。如果您打算定期加入二進制文件,請考慮使用二進制存儲解決方案,例如Git LFS。

+0

謝謝,但既不是XML二進制文件,也不能(基本上)處理二進制文件。 –

相關問題