5

いくつかのバイナリ ファイルを git に保存しなければならないという不幸な状況にありますが、

ただし、データをディスクに保存する方法を選択できます-Git(ビルドシステムのみが読み取る必要がある独自の形式)。

それほど重要だとは思わないので、詳細についてはあまり話したくありませんが、いくつかのコンテキストを示すために、これらは多くのアイコンファイルですが、同じ質問が多くの小さなサウンドファイルまたは 3d モデルにも当てはまります。

これらのファイルを 1 つの大きなイメージに変換することはビルド ステップであるため、イメージは任意の方法で git に保存できます。

  • バイナリ圧縮(例:PNG(画像)、FLAC(音声))
  • バイナリ非圧縮 (例: PPM (画像)、非圧縮-WAV (音声))
  • バイナリ データの ASCII 表現 (例: MIME エンコード、XPM (画像))

一部のファイルがときどき変更されると仮定しましょう。そのため、ピクセルへの小さな変更ごとに新しいバイナリ BLOB を保存しないようにするとよいでしょう。

私は知りたいです:

  • バイナリ ファイルが変更されるたびに (数バイトであっても)、まったく新しいバイナリ blob を格納するオプションはどれですか。
  • git diff は圧縮されていないバイナリ データよりも優れていますか?
  • ファイルの一部のみが定期的に変更されると仮定すると、大きなバイナリ ファイルへの小さな変更を git で効率的に処理できますか?

バイナリファイルの使用を完全に回避できないと仮定して、大きなgitリポジトリを回避するための最良のオプションは何ですか(バイナリファイルに対して編集が行われるため)、すべてのことを考慮しましたか?

4

1 に答える 1

5

バイナリ ファイルが変更されるたびに (数バイトであっても)、まったく新しいバイナリ blob を格納するオプションはどれですか。

それらのすべて。すべてのブロブ (実際には、レポ内のすべてのオブジェクト) は、"ルーズ オブジェクト" である場合は常に "無傷" (多かれ少なかれ) に格納されます。それらで行われる唯一のことは、それらにヘッダーを付けて、deflate 圧縮で圧縮することです。

しかし同時に、ばらばらなオブジェクトは最終的に「パック」に結合されます。Git はパック内のファイルに対してデルタ圧縮を行います。「Git バイナリ差分アルゴリズム (デルタ ストレージ) は標準化されていますか? 」を参照してください。. そこの回答に基づいて、パックファイルデルタアルゴリズムが一致するバイナリデータの長い文字列を見つけることができるように、バイナリを「事前圧縮」しない方がはるかに良いでしょう。

git diff は圧縮されていないバイナリ データよりも優れていますか?

私はそれを試していませんが、全体的な意味は、これに対する答えは「はい」でなければならないということです.

ファイルの一部のみが定期的に変更されると仮定すると、大きなバイナリ ファイルへの小さな変更を git で効率的に処理できますか?

確かに、完全に変更されていないすべてのファイルは、多くの「重複排除」とともに即座に保存されます。これは、SHA-1 チェックサムがすべてのコミットで同一であるため、各ツリーがリポジトリ内のまったく同じ BLOB に名前を付けるためです。foo.iconが何千ものコミットで同じである場合、foo.icon格納されているのは 1 つの BLOB (SHA-1 が何であれ) だけです。


少し実験することをお勧めします: 提案されたバイナリでダミーのテスト リポジトリを作成し、提案された変更を行い、実行前と実行後にリポジトリの大きさを確認してgit gc、緩いオブジェクトを再パックします。多くの調整可能要素があることに注意してください。window特に、 、depthおよびwindow-memory設定 (コマンド ラインまたは git config エントリで設定できます) をいじりたいと思うかもしれません。

于 2013-12-19T19:43:06.410 に答える