我有一個二進制文件格式,我包含在一個git存儲庫中。我知道二進制文件的格式,可以設想爲它們創建一個類似diff的工具,它會產生一個文本輸出,所以當我查看一個git歷史記錄時,我可以看到差異。我甚至可以創建一個可以獲取原始二進制文件的工具,以及diff文本並創建新的二進制文件,這樣git無需一次又一次地保存二進制文件,只需稍作更改即可。git和二進制文件的自定義比較
如果我要製作這些類型的工具,我該如何將它與git集成?
我有一個二進制文件格式,我包含在一個git存儲庫中。我知道二進制文件的格式,可以設想爲它們創建一個類似diff的工具,它會產生一個文本輸出,所以當我查看一個git歷史記錄時,我可以看到差異。我甚至可以創建一個可以獲取原始二進制文件的工具,以及diff文本並創建新的二進制文件,這樣git無需一次又一次地保存二進制文件,只需稍作更改即可。git和二進制文件的自定義比較
如果我要製作這些類型的工具,我該如何將它與git集成?
從git help config
:
diff.external
If this config variable is set, diff generation is not performed
using the internal diff machinery, but using the given command. Can
be overridden with the ‘GIT_EXTERNAL_DIFF’ environment variable.
The command is called with parameters as described under "git
Diffs" in git(1). Note: if you want to use an external diff program
only on a subset of your files, you might want to use
gitattributes(5) instead.
gitattributes(5)
還提到一個叫textconv
機制:不是提供一個diff程序,你提供你的二進制文件轉換爲文本摘要的程序;然後使用正常的git diff機制來呈現這些文本摘要的差異。
編輯:我不知道有什麼辦法讓底層對象打包例程使用自定義diff工具。讀取低級git-pack-objects(1)
手冊頁的行之間,底層包格式可能使用二進制比較格式,該格式自適應搜索現有對象以構建二進制增量,以避免存儲整個新對象。在這個級別上,對象(文件)只是二進制blob,我認爲除了最晦澀的情況外,最好將對象包裝作爲實現細節。換句話說,如果你的二進制對象在二進制級別是相似的,它們將被git自動有效地表示。我可以想象出這種情況並非如此的常見情況是壓縮和加密文件。
這是偉大的提供一個可讀的輸出,但我也可以用它來使整個二進制文件不會保存每次它的變化,而不是隻是差異?我想,需要進行一些向後差異化(將diff應用於原始文件以獲取新文件)。 – Michael