git リポジトリに含めるバイナリ ファイル形式があります。私はバイナリのファイル形式を知っており、おそらくテキスト出力を生成するツールのような差分を作成できるので、git の履歴を見たときに差分を見ることができます。元のバイナリ ファイルと差分テキストを取り、新しいバイナリ ファイルを作成するツールを作成することもできます。そうすれば、git はバイナリ ファイルを何度も何度も保存する必要がなくなります。
これらのタイプのツールを作成する場合、どのように git と統合できますか?
git リポジトリに含めるバイナリ ファイル形式があります。私はバイナリのファイル形式を知っており、おそらくテキスト出力を生成するツールのような差分を作成できるので、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
。差分プログラムを提供する代わりに、バイナリファイルをテキストの要約に変換するプログラムを提供します。次に、通常の git diff メカニズムを使用して、これらのテキストの要約の差分を表示します。
編集: 低レベルのオブジェクト パッキング ルーチンでカスタム diff ツールを使用する方法がわかりません。低レベルのgit-pack-objects(1)
マニュアル ページの行間を読むと、基礎となる pack 形式はバイナリ diff 形式を使用している可能性が高いようです。これは、既存のオブジェクトを適応的に検索してバイナリ デルタを構築し、新しいオブジェクト全体を保存することを回避します。このレベルでは、オブジェクト (ファイル) は単なるバイナリ BLOB であり、最もあいまいなケースを除いて、オブジェクトのパッキングを実装の詳細として扱うのがおそらく最善だと思います。
つまり、バイナリ オブジェクトがバイナリ レベルで互いに類似している場合、それらは git によって自動的に効率的に表現されます。これが当てはまらないと想像できる一般的なケースは、圧縮および暗号化されたファイルです。