1. ホーム
  2. git

[解決済み] gitオブジェクトを抽出するためにコマンドラインツールでDEFLATEを行うには?

2023-06-06 16:10:12

質問

DEFLATEアルゴリズムのコマンドラインラッパーを探しています。

DEFLATEを使って圧縮されたファイル(git blob)があり、それを解凍したいのです。gzipコマンドは、gzipフォーマットではなく、DEFLATEアルゴリズムを直接使用するオプションを持っていないようです。

理想的には、私はこれを行うことができる標準的なUnix/Linuxツールを探しています。

edit: これは私の問題のためにgzipを使おうとしたときに得られた出力です。

$ cat .git/objects/c0/fb67ab3fda7909000da003f4b2ce50a53f43e7 | gunzip

gzip: stdin: not in gzip format

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

UPDATEしてください。 Mark Adlerは、git blobは生のDEFLATEストリームではなく、zlibストリームであることを指摘しました。これを解凍するには pigz ツールで解凍できます。このツールはいくつかのLinuxディストリビューションにプリパッケージされています。

$ cat foo.txt 
file foo.txt!

$ git ls-files -s foo.txt
100644 7a79fc625cac65001fb127f468847ab93b5f8b19 0   foo.txt

$ pigz -d < .git/objects/7a/79fc625cac65001fb127f468847ab93b5f8b19 
blob 14file foo.txt!

kriegaex により編集されました。 Git Bash for Windows のユーザーは pigz はデフォルトでは利用できません。プリコンパイルされた32/64ビット版を見つけることができます。 はこちら . 私は64ビット版を試しましたが、うまく動きました。例えば pigz.exe を直接 c:\Program Files\Git\usr\bin をパス上に置くようにします。


歴史的な理由で保存されている、私のオリジナルの回答です。

のヒントを理解するならば、私は ウィキペディアの記事 にあるヒントを理解するならば、Marc van Kempen によって言及された puff.c から zlib を直接呼び出します。

これは小さな例です。

#include <assert.h>
#include <string.h>
#include "puff.h"

int main( int argc, char **argv ) {
    unsigned char dest[ 5 ];
    unsigned long destlen = 4;
    const unsigned char *source = "\x4B\x2C\x4E\x49\x03\x00";
    unsigned long sourcelen = 6;    
    assert( puff( dest, &destlen, source, &sourcelen ) == 0 );
    dest[ 4 ] = '\0';
    assert( strcmp( dest, "asdf" ) == 0 );
}