UPDATE: Mark Adler bemerkte, dass Git-Blobs keine rohen DEFLATE-Streams sind, sondern Zlib-Streams. Diese können mit dem pigz
Tool entpackt werden , das in mehreren Linux-Distributionen vorinstalliert ist:
$ 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!
Bearbeiten von kriegaex: Git Bash für Windows-Benutzer werden feststellen, dass pigz standardmäßig nicht verfügbar ist. Vorkompilierte 32/64-Bit-Versionen finden Sie hier . Ich habe die 64-Bit-Version ausprobiert und sie funktioniert gut. Sie können beispielsweise pigz.exe direkt nach kopieren c:\Program Files\Git\usr\bin
, um es auf den Pfad zu setzen.
Meine ursprüngliche Antwort aus historischen Gründen:
Wenn ich den Hinweis in der verstehe von Marc van Kempen erwähnten Wikipedia-Artikel , können Sie ihn direkt puff.c
von zlib verwenden .
Dies ist ein kleines Beispiel:
#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 );
}
-dz
Option dekomprimiert und das zlib-Format mit generiert-z
.-z, --zlib Compress to zlib (.zz) instead of gzip format
. Ab sofort ist dieses Flag nur zum Komprimieren und nicht zum Dekomprimieren relevant.pigz -d < "infile" > "outfile"
funktioniert gut.So etwas wie das Folgende druckt den Rohinhalt, einschließlich des Headers "$ type $ length \ 0":
quelle
78
Marker und den endgültigen CRC.C
mit zlib komprimiert wurden , also tolle Antwort. Und wie immer: Am Ende sind die meisten Weltprobleme mit einem PERL-Einzeiler lösbar;)Sie können dies mit dem OpenSSL-Befehlszeilentool tun:
Leider ist der
zlib
Unterbefehl zumindest unter Ubuntu in der Standard-Build-Konfiguration (--no-zlib
--no-zlib-dynamic
) deaktiviert , sodass Sie ihnopenssl
aus dem Quellcode kompilieren müssen, um ihn verwenden zu können. Es ist jedoch beispielsweise in Arch standardmäßig aktiviert.Bearbeiten: Scheint, als würde der
zlib
Befehl auch auf Arch nicht mehr unterstützt. Diese Antwort ist möglicherweise nicht mehr nützlich :(quelle
zlib
Unterbefehl (und die-z
Option zumenc
Unterbefehl) nicht verfügbar ist, wenn Ihr Build von openssl mit den Standardoptionen konfiguriert wurde, einschließlich--no-zlib
und--no-zlib-dynamic
. Diese Antwort funktioniert also nur, wenn Ihr openssl mit demno-
Präfix kompiliert wurde, das aus einer dieser Konfigurationsoptionen entfernt wurde. Sie können erkennen, indem Sie-DZLIB
in der Ausgabe vonopenssl version -f
LibreSSL 2.2.7
. Ich bekommeopenssl:Error: 'zlib' is an invalid command.
pythonischer Einzeiler:
quelle
repr(...)
scheint alles in Anführungszeichen zu setzen ('...'
), also musste ich es entfernen (Dekomprimieren einer zlib-komprimierten JSON-Datei).python -c "import zlib,sys;print(zlib.decompress(sys.stdin.buffer.read()).decode('utf8'))" < $IN
, wenn Sie eine utf8-Datei zum Beispiel in Python 3Sie können zlib-flate wie folgt verwenden:
Es ist standardmäßig auf meinem Computer vorhanden, aber es ist Teil von
qpdf - tools for and transforming and inspecting PDF files
wenn Sie es installieren müssen.Ich habe
echo
am Ende des Befehls eine angezeigt , da es einfacher ist, die Ausgabe auf diese Weise zu lesen.quelle
Versuchen Sie den folgenden Befehl:
Es werden keine externen Tools benötigt.
Quelle: Wie dekomprimiere ich zlib-Daten unter UNIX? bei unix SE
quelle
zlipd() (printf "\x1f\x8b\x08\x00\x00\x00\x00\x00" |cat - $@ |gzip -dc)
zu meinem.bashrc
jetzt hinzugefügt :)2> /dev/null
, um stderr auf null zu senden.Hier ist ein Ruby-Einzeiler (cd .git / first und Pfad zu einem beliebigen Objekt identifizieren):
quelle
ruby -rzlib -e 'print Zlib::Inflate.inflate($stdin.read).split("\x00")[1..-1].join' < .git/objects/abc
Ich habe es satt, keine gute Lösung dafür zu haben, also habe ich etwas auf NPM gesetzt:
https://github.com/jezell/zlibber
Jetzt kann nur noch ein Befehl zum Aufblasen / Entleeren geleitet werden.
quelle
inflate < filename
Hier ist ein Beispiel für das Aufbrechen eines Commit-Objekts in Python:
Was Sie dort sehen werden, ist fast identisch mit der Ausgabe von 'git cat-file -p [hash]', außer dass dieser Befehl den Header nicht druckt ('commit' gefolgt von der Größe des Inhalts und einem Null-Byte).
quelle
open
:file = open(".git/objects/09/72d7651ff85bedf464fba868c2ef434543916a", "rb")
Es sieht so aus, als hätte Mark Adler uns im Sinn und ein Beispiel dafür geschrieben: http://www.zlib.net/zpipe.c
Es wird nur mit kompiliert
gcc -lz
und die zlib-Header installiert. Ich habe die resultierende Binärdatei auf meine kopiert,/usr/local/bin/zpipe
während ich mit Git-Sachen gearbeitet habe.quelle
Git-Objekte werden
zlib
eher durch als komprimiertgzip
, also entwederzlib
zum Dekomprimieren oder mit dem Befehl git, dhgit cat-file -p <SHA1>
zum Drucken von Inhalten.quelle
git cat-file -p <SHA1>
ist nicht der gesamte Inhalt der zlib Dekompression.git/objects/<SHA1>
. Der Unterschied ist der Schlüssel, wenn Sie versuchen, einen Git-Commit-Hash-Rechner zu implementieren ...quelle
Siehe http://en.wikipedia.org/wiki/DEFLATE#Encoder_implementations
Es listet eine Reihe von Software-Implementierungen auf, einschließlich gzip, damit dies funktioniert. Haben Sie versucht, nur gzip für die Datei auszuführen? Erkennt es das Format nicht automatisch?
Woher wissen Sie, dass es mit DEFLATE komprimiert wird? Mit welchem Tool wurde die Datei komprimiert?
quelle
Warum verwenden Sie nicht einfach die Tools von git, um auf die Daten zuzugreifen? Dies sollte in der Lage sein, jedes Git-Objekt zu lesen:
quelle
git cat-file -p c0fb67ab3fda7909000da003f4b2ce50a53f43e7
Ich fand diese Frage auf der Suche nach einer Problemumgehung mit einem Fehler im
-text
Dienstprogramm in der neuen Version deshadoop dfs
Clients, den ich gerade installiert habe. Das-text
Dienstprogramm funktioniert wiecat
folgt: Wenn die gelesene Datei komprimiert ist, wird der Klartext (daher der Name) transparent dekomprimiert und ausgegeben.Die bereits veröffentlichten Antworten waren auf jeden Fall hilfreich, aber einige von ihnen haben ein Problem beim Umgang mit Datenmengen in Hadoop-Größe: Sie lesen alles vor dem Dekomprimieren in den Speicher.
Also, hier sind meine Variationen der
Perl
undPython
Antworten oben, die diese Einschränkung nicht haben:Python:
Perl:
Beachten Sie die Verwendung des
-cat
Unterbefehls anstelle von-text
. Dies ist so, dass meine Problemumgehung nicht unterbrochen wird, nachdem der Fehler behoben wurde. Entschuldigung für die Lesbarkeit der Python-Version.quelle
Git-Objekte sind Zlib-Streams (keine Rohdaten). pigz dekomprimiert diejenigen mit der
-dz
Option.quelle
Um die Sammlung zu erweitern, finden Sie hier Perl-Einzeiler für Deflate / Inflate / Raw Deflate / Raw Inflate.
Entleeren
Aufblasen
Rohe Entleerung
Rohes Aufblasen
quelle
pigz kann es:
quelle
quelle