1. ホーム
  2. git

[解決済み] Git は ZIP ファイルをディレクトリとして扱い、ZIP 内のファイルを blob として扱うことができますか?

2023-06-15 06:37:52

質問

シナリオについて

の中に常に保存されているファイルを使って作業することを強いられるとします。 .zip ファイル内に常に格納されているファイルを扱うことを余儀なくされたとします。ZIP ファイル内のファイルの中には、小さなテキスト ファイルで頻繁に変更されるものもあれば、大きなファイルでありながら幸運にもどちらかといえば静的なもの (たとえば、画像) もあります。

これらの ZIP ファイルを Git リポジトリの中に置きたい場合、それぞれの ZIP は blob として扱われるので、私がコミットするたびにリポジトリは ZIP ファイルのサイズだけ大きくなります...たとえ中の小さなテキストファイルがひとつだけ変化したとしてもです!

このような ZIP ファイルを Git リポジトリの中に置きたい場合、ZIP ファイルを 1 つの blob として扱い、ZIP ファイルのサイズだけ大きくする必要があります。

なぜこれが現実的なのか

マイクロソフト ワード 2007 / 2010 .docx とエクセル .xlsx のファイルはZIPファイルです...

欲しいもの

ひょっとして、ZIPファイルをファイルとして扱わず、ディレクトリとして扱い、その中身をファイルとして扱うようにGitに指示する方法がありますか?

利点は

しかし、うまくいくはずがない、と?

私は、追加のメタデータがなければ、これがある程度の曖昧さにつながることを理解しています。 git checkout を作成するかどうかを決定しなければなりません。 foo.zip/bar.txt を通常のディレクトリにあるファイルとして作成するのか、それともZIPファイルとして作成するのかを決めなければなりません。しかし、これは設定オプションで解決できるのではないでしょうか。

それがどのように行われ得るかについての2つのアイデア (まだ存在しないのであれば)

  • などのライブラリを使って minizip または IO::Compress::Zip Gitの内部
  • ファイルシステムのレイヤーを追加して、Git が ZIP ファイルをディレクトリとして認識するようにする。

どのように解決するのですか?

これは存在しませんが、現在のフレームワークでは容易に存在し得ます。Git が diff を実行するときにバイナリやASCIIファイルを表示して異なる動作をするように、設定インターフェイスを通じて特定のファイル形式に対して特別な処理を提供するよう指示することができます。

コードベースを変更したくない場合 (これはちょっとクールなアイデアですが)、次のようにして自分用にスクリプト化することもできます。 プリコミットおよびポストチェックアウトフック を使用して、ファイルを解凍して保存し、チェックアウト時に .zip の状態に戻すこともできます。で指定されたファイル blob / インデックスのみへのアクションを制限する必要があります。 git add .

どちらの方法でも、ちょっとした作業です。他のGitコマンドが、何が起こっているのかを認識してうまく立ち回れるかどうかが問題なのです。