Как дефлировать с помощью инструмента командной строки для извлечения объекта git?
Я ищу оболочку командной строки для алгоритма DEFLATE.
У меня есть файл (git blob), который сжимается с помощью DEFLATE, и я хочу его распаковать. Команда gzip, похоже, не имеет возможности напрямую использовать алгоритм DEFLATE, а не формат gzip.
В идеале я ищу стандартный инструмент Unix / Linux, который может это сделать.
edit: это вывод, который я получаю при попытке использовать gzip для моей проблемы:
$ cat .git/objects/c0/fb67ab3fda7909000da003f4b2ce50a53f43e7 | gunzip
gzip: stdin: not in gzip format
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