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



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



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



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



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



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

gzip: stdin: not in gzip format
638   18  
git

18 ответов:

обновление: Марк Адлер отметил, что Git blobs-это не сырые потоки дефляции, а потоки 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 ] = '';
    assert( strcmp( dest, "asdf" ) == 0 );
}

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

perl -MCompress::Zlib -e 'undef $/; print uncompress(<>)' \
     < .git/objects/27/de0a1dd5a89a94990618632967a1c86a82d577

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

openssl zlib -d < $IN > $OUT

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

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

pythonic one-liner:

$> python -c "import zlib,sys;print \
           repr(zlib.decompress(sys.stdin.read()))" < $IN

вы можете использовать zlib-flate, например:

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

Это есть по умолчанию на моей машине, но это часть qpdf - tools for and transforming and inspecting PDF files Если вам нужно установить его.

Я выскочил в echo в конце команды, так как это легче читать вывод Таким образом.

попробуйте выполнить следующую команду:

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

внешние инструменты не требуются.

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

вот Рубин один-лайнер ( компакт-диска .git / first и определить путь к любому объекту ):

ruby -rzlib -e 'print Zlib::Inflate.new.inflate(STDIN.read)' < ./74/c757240ec596063af8cd273ebd9f67073e1208

вот пример взлома объекта фиксации в 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]", за исключением того, что команда не печатает заголовок ("commit", за которым следует размер содержимого и нулевой байт).

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

https://github.com/jezell/zlibber

теперь можно просто трубу надуть / выкачать команду.

объекты git сжимаются с помощью zlib, а не gzip, Так что либо с помощью zlib чтобы распаковать его, или команда git, т. е. git cat-file -p <SHA1>, для печати содержимого.

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

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

// save this as deflate.go

package main

import (
    "compress/zlib"
    "io"
    "os"
    "flag"
)

var infile = flag.String("f", "", "infile")

func main() {
    flag.Parse()
    file, _ := os.Open(*infile)

    r, err := zlib.NewReader(file)
    if err != nil {
        panic(err)
    }
    io.Copy(os.Stdout, r)

    r.Close()
}

$ go build deflate.go
$ ./deflate -f .git/objects/c0/fb67ab3fda7909000da003f4b2ce50a53f43e7

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

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

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

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

git show --pretty=raw <object SHA-1>

я нашел этот вопрос ищет обходной путь с ошибкой с -text утилита в новой версии hadoop dfs клиент, который я только что установил. Элемент -text утилита работает как cat, за исключением того, что считываемый файл сжат, он прозрачно распаковывает и выводит обычный текст (отсюда и название).

уже опубликованные ответы были определенно полезны, но у некоторых из них есть одна проблема при работе с объемами данных размером с Hadoop - они все читают память перед распаковкой.

Итак, вот мои вариации на Perl и Python ответы выше, которые не имеют этого ограничения:

Python:

hadoop fs -cat /path/to/example.deflate |
  python -c 'import zlib,sys;map(lambda b:sys.stdout.write(zlib.decompress(b)),iter(lambda:sys.stdin.read(4096),""))'

Perl:

hadoop fs -cat /path/to/example.deflate |
  perl -MCompress::Zlib -e 'print uncompress($buf) while sysread(STDIN,$buf,4096)'

обратите внимание на использование -cat суб-команда, а не -text. Это так, что моя работа вокруг не ломается после того, как они исправили ошибку. Приносим извинения за читаемость версии python.

объекты в Git-поток с zlib (не сырые сдуется). pigz распакует те, с .

pigz можете сделать это:

apt-get install pigz
unpigz -c .git/objects/c0/fb67ab3fda7909000da003f4b2ce50a53f43e7
const zlib = require("zlib");
const adler32 = require("adler32");
const data = "hello world~!";
const chksum = adler32.sum(new Buffer(data)).toString(16);
console.log("789c",zlib.deflateRawSync(data).toString("hex"),chksum);
// or
console.log(zlib.deflateSync(data).toString("hex"));

Comments

    Ничего не найдено.