$ cat .git/objects/c0/fb67ab3fda7909000da003f4b2ce50a53f43e7 | gunzip
gzip: stdin: not in gzip format
$ cat .git/objects/c0/fb67ab3fda7909000da003f4b2ce50a53f43e7 | gunzip
gzip: stdin: not in gzip format
您可以使用OpenSSL命令行工具来完成此操作:
openssl zlib -d < $IN > $OUT
不幸的是,至少在 Ubuntu 上,默认的构建配置 (--no-zlib
和--no-zlib-dynamic
) 禁用了 zlib
子命令,因此您需要从源代码编译 openssl
才能使用它。但是,在 Arch 上默认情况下启用它。
编辑:看起来在 Arch 上也不再支持 zlib
命令了。这个答案可能已经没有用了 :(
LibreSSL 2.2.7
无法正常工作。我收到了 openssl:Error: 'zlib' is an invalid command.
的错误提示。 - prayagupa类似下面的代码将打印原始内容,包括"$type $length\0"头部:
perl -MCompress::Zlib -e 'undef $/; print uncompress(<>)' \
< .git/objects/27/de0a1dd5a89a94990618632967a1c86a82d577
78
标记和最终CRC的情况下产生空输出和零退出码。 - ulidtkoC
的任何数据,所以很好用。而且通常情况下,大多数世界问题都可以通过一个PERL一行代码解决 ;) - MeckiPythonic一行代码:
$> python -c "import zlib,sys;print \
repr(zlib.decompress(sys.stdin.read()))" < $IN
repr(...)
似乎会将所有内容用引号 ('...'
) 包裹起来,所以我不得不将其删除(解压缩一个 zlib 压缩的 JSON 文件)。 - Adam Lindbergpython -c“import zlib,sys;print(zlib.decompress(sys.stdin.buffer.read()).decode('utf8'))”< $IN
。 - Cyrille Pontvieux更新:Mark Adler指出,git blob不是原始的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!
c:\Program Files\Git\usr\bin
,以便将其放在路径上。brew install pigz
或sudo port install pigz
进行安装(如果您还没有它,则可以按照官网上的说明安装Homebrew)。
出于历史原因,以下是我的原始答案:
如果我理解Marc van Kempen提到的Wikipedia文章中的提示,您可以直接使用zlib中的puff.c
。
这是一个小例子:
#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
选项解压缩zlib格式,也可以通过-z
选项生成zlib格式。 - Mark Adler-z, --zlib
压缩成 zlib 格式(.zz),而不是 gzip 格式。目前此标志仅适用于压缩,不适用于解压缩。 pigz -d < "infile" > "outfile"
可以正常工作。 - murla<
(标准输入重定向)会导致它失败,并显示pigz: skipping: .git/objects/12/2898... does not have compressed suffix
。 - undefinedcat .git/objects/c0/fb67ab3fda7909000da003f4b2ce50a53f43e7 \
| zlib-flate -uncompress; echo
如果你需要安装,它默认已经在我的机器上了,但它是 qpdf - 用于转换和检查PDF文件的工具
的一部分。
我在命令的结尾加上了一个echo
,因为这样输出更容易阅读。
printf "\x1f\x8b\x08\x00\x00\x00\x00\x00" | cat - .git/objects/c0/fb67ab3fda7909000da003f4b2ce50a53f43e7 | gunzip
来源:unix SE上的如何在UNIX中解压缩zlib数据?
.bashrc
中添加了zlipd() (printf "\x1f\x8b\x08\x00\x00\x00\x00\x00" |cat - $@ |gzip -dc)
,现在 :) - Tobias Kienzler2> /dev/null
将 stderr 发送到 null。 - poe84it这里是一个Ruby单行代码(首先进入.git/目录并确定任何对象的路径):
ruby -rzlib -e 'print Zlib::Inflate.new.inflate(STDIN.read)' < ./74/c757240ec596063af8cd273ebd9f67073e1208
ruby -rzlib -e 'print Zlib::Inflate.inflate($stdin.read).split("\x00")[1..-1].join' < .git/objects/abc
- yachiinflate < 文件名
- Andrei Damian-Fekete$ 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!
open
函数中添加 "rb" 开关,例如:file = open(".git/objects/09/72d7651ff85bedf464fba868c2ef434543916a", "rb")
。 - Igor Popov看起来Mark Adler考虑到了我们,他写了一个例子来展示如何实现这一点: http://www.zlib.net/zpipe.c
它只需要安装zlib头文件,就可以使用gcc -lz
编译。我在处理git事务时将生成的二进制文件复制到了我的/usr/local/bin/zpipe
中。