Как сделать 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 ]

6 голосов
/ 09 января 2013

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

5 голосов
/ 01 февраля 2016
// 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
1 голос
/ 13 мая 2014

Я нашел этот вопрос в поиске обходного пути с ошибкой с помощью утилиты -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.

1 голос
/ 05 июля 2010

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

git show --pretty=raw <object SHA-1>
1 голос
/ 05 июля 2010

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

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

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

1 голос
/ 05 ноября 2017

git объекты - потоки zlib (не необработанный deflate). pigz распакует те, у кого есть опция -dz.

0 голосов
/ 29 мая 2019

Чтобы добавить в коллекцию, здесь представлены однострочные perl для deflate / inflate / raw deflate / raw inflate.

выкачивает

perl -MIO::Compress::Deflate -e 'undef $/; my ($in, $out) = (<>, undef); IO::Compress::Deflate::deflate(\$in, \$out); print $out;'

Накачать

perl -MIO::Uncompress::Inflate -e 'undef $/; my ($in, $out) = (<>, undef); IO::Uncompress::Inflate::inflate(\$in, \$out); print $out;'

Сырой дефлят

perl -MIO::Compress::RawDeflate -e 'undef $/; my ($in, $out) = (<>, undef); IO::Compress::RawDeflate::rawdeflate(\$in, \$out); print $out;'

Необработанный надувать

perl -MIO::Uncompress::RawInflate -e 'undef $/; my ($in, $out) = (<>, undef); IO::Uncompress::RawInflate::rawinflate(\$in, \$out); print $out;'
0 голосов
/ 04 ноября 2017
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"));
0 голосов
/ 15 мая 2017

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

apt-get install pigz
unpigz -c .git/objects/c0/fb67ab3fda7909000da003f4b2ce50a53f43e7
...