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

StackOverflow https://stackoverflow.com/questions/3178566

  •  02-10-2019
  •  | 
  •  

Вопрос

Я ищу командный обертку для алгоритма дежита.

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

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

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

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

gzip: stdin: not in gzip format
Это было полезно?

Решение

ОБНОВИТЬ: Марк Адлер отметил, что 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!

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

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

Другие советы

Что-то вроде следующее будет распечатать необработанное содержимое, включая заголовок «$ type $ длиной 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 от источника, чтобы использовать его. Но он включен по умолчанию на арке, например.

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

Питоновый одноклассник:

$> 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.

Вот рубиновый одноклассник (CD .GIT / First и определить путь к любому объекту):

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

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

https://github.com/jezell/zlibber

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

Вот пример ломания открытия объекта Commit в 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», а затем размер содержимого и нулевой байт).

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

Это с компилированием не более чем gcc -lz и заголовки Zlib установлены. Я скопировал в результате двоичный двоичный /usr/local/bin/zpipe Работая с Git вещи.

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

// 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 (не сырой дефлят). росписи будет распаковать тех, кто -dz вариант.

росписи может сделать это:

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"));

Чтобы добавить в коллекцию, вот Perl One-Listers для дежитана / надувания / сырой дефляции / сырой наполнения.

Выпускать

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;'
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top