Как сделать DEFLATE с помощью инструмента командной строки, чтобы извлечь объект git? - PullRequest
75 голосов
/ 05 июля 2010

Я ищу оболочку командной строки для алгоритма DEFLATE.

У меня есть файл (git blob), сжатый с помощью DEFLATE, и я хочу его распаковать.Команда gzip, похоже, не имеет возможности напрямую использовать алгоритм DEFLATE, а не формат gzip.

В идеале я ищу стандартный инструмент Unix / Linux, который может это сделать.1006 * edit: Это вывод, который я получаю при попытке использовать gzip для моей задачи:

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

gzip: stdin: not in gzip format

Ответы [ 19 ]

50 голосов
/ 06 июля 2010

Примерно следующее будет печатать необработанный контент, включая заголовок «$ type $ length \ 0»:

perl -MCompress::Zlib -e 'undef $/; print uncompress(<>)' \
     < .git/objects/27/de0a1dd5a89a94990618632967a1c86a82d577
43 голосов
/ 21 декабря 2013

Вы можете сделать это с помощью инструмента командной строки OpenSSL:

openssl zlib -d < $IN > $OUT

К сожалению, по крайней мере в Ubuntu подкоманда zlib отключена в конфигурации сборки по умолчанию (--no-zlib --no-zlib-dynamic), поэтому вам потребуется скомпилировать openssl из исходного кода для ее использования. Но он включен по умолчанию на Arch, например.

Edit: похоже, что команда zlib больше не поддерживается в Arch. Этот ответ может быть бесполезен: (

39 голосов
/ 30 ноября 2011

питоническая однострочная:

$> python -c "import zlib,sys;print \
           repr(zlib.decompress(sys.stdin.read()))" < $IN
25 голосов
/ 09 октября 2013

Вы можете использовать zlib-flate следующим образом:

cat .git/objects/c0/fb67ab3fda7909000da003f4b2ce50a53f43e7 \
    | zlib-flate -uncompress; echo

По умолчанию на моем компьютере он есть, но он входит в qpdf - tools for and transforming and inspecting PDF files, если вам нужно его установить.

Я набрал echo в конце команды, так как это проще для чтения.

18 голосов
/ 27 февраля 2015

Попробуйте следующую команду:

printf "\x1f\x8b\x08\x00\x00\x00\x00\x00" | cat - .git/objects/c0/fb67ab3fda7909000da003f4b2ce50a53f43e7 | gunzip

Внешние инструменты не нужны.

Источник: Как распаковать данные zlib в UNIX? в unix SE

14 голосов
/ 29 декабря 2011

Вот Ruby с одной строкой (cd .git / first и укажите путь к любому объекту):

ruby -rzlib -e 'print Zlib::Inflate.new.inflate(STDIN.read)' < ./74/c757240ec596063af8cd273ebd9f67073e1208
11 голосов
/ 05 июля 2010

ОБНОВЛЕНИЕ: Марк Адлер отметил, что git-объекты - это не необработанные потоки 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!

Мой первоначальный ответ, сохраненный по историческим причинам:

Если я понимаю подсказку в статье Википедии , упомянутой Марком ван Кемпеном, вы можете использовать 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 );
}
11 голосов
/ 04 августа 2013

Я устал от того, что у меня нет хорошего решения для этого, поэтому я добавил что-то в NPM:

https://github.com/jezell/zlibber

Теперь можно просто передать команду раздувать / сдуть.

9 голосов
/ 30 июня 2011

Вот пример взлома открытого объекта фиксации в Python:

$ git show
commit 0972d7651ff85bedf464fba868c2ef434543916a
# all the junk in my commit...
$ python
>>> import zlib
>>> file = open(".git/objects/09/72d7651ff85bedf464fba868c2ef434543916a")
>>> data = file.read()
>>> print data
# binary garbage
>>> unzipped_data = zlib.decompress(data)
>>> print unzipped_data
# all the junk in my commit!

То, что вы увидите там, почти идентично выводу git cat-file -p [hash] ', за исключениемКоманда не печатает заголовок (за коммитом следуют размер содержимого и нулевой байт).

7 голосов
/ 04 июня 2013

Похоже, Марк Адлер имеет в виду нас и написал пример того, как это сделать: http://www.zlib.net/zpipe.c

Он компилируется только с gcc -lz и установленными заголовками zlib.Я скопировал полученный бинарный файл в /usr/local/bin/zpipe во время работы с git.

...