Как ВЫКАЧАТЬ с инструментом командной строки для извлечения объекта мерзавца?

Я ищу обертку командной строки для ВЫКАЧИВАТЬ алгоритма.

У меня есть файл (блоб мерзавца), который сжат с помощью, ВЫКАЧИВАЮТ, и я хочу распаковать его. Команда gzip, кажется, не имеет опцию непосредственно использовать ВЫКАЧИВАТЬ алгоритм, а не gzip формат.

Идеально я ищу стандартный инструмент Unix/Linux, который может сделать это.

править: Это - вывод, который я получаю при попытке использовать gzip для моей проблемы:

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

gzip: stdin: not in gzip format
75
задан Ciro Santilli 新疆改造中心法轮功六四事件 5 September 2018 в 19:58
поделиться

4 ответа

UPDATE: Марк Адлер заметил, что git blobs - это не сырые 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!

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

Если я правильно понял подсказку в статье Wikipedia, упомянутой Марком ван Кемпеном, вы можете использовать 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 );
}
13
ответ дан 24 November 2019 в 11:26
поделиться

Почему бы вам просто не использовать инструменты git для доступа к данным? Он должен иметь возможность читать любой объект git:

git show --pretty=raw <object SHA-1>
1
ответ дан 24 November 2019 в 11:26
поделиться

См. http://en.wikipedia.org/wiki/DEFLATE#Encoder_implementations

Он перечисляет ряд программных реализаций, включая gzip, так что они должны работать. Вы пробовали просто запустить gzip для файла? Не распознает ли формат автоматически?

Как узнать, что формат сжат с помощью DEFLATE? Какой инструмент использовался для сжатия файла?

1
ответ дан 24 November 2019 в 11:26
поделиться

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

perl -MCompress::Zlib -e 'undef $/; print uncompress(<>)' \
     < .git/objects/27/de0a1dd5a89a94990618632967a1c86a82d577
50
ответ дан 24 November 2019 в 11:26
поделиться
Другие вопросы по тегам:

Похожие вопросы: