我写了一个小的groovy实用程序,可以解压缩git blob对象并且它可以工作,我可以看到blob的内容。提交也是如此。
问题出在树上。当我打开包装时,我得到:
tree 29100644 a�⛲��CK�)�wZ���S�
。正如您在对象大小后看到的那样,无法读取内容。看起来这个内容保持不同的格式。
这是我的代码:
ByteArrayOutputStream result = new ByteArrayOutputStream()
InflaterOutputStream byteWriter = new InflaterOutputStream(result)
byteWriter.write(new File(input).bytes)
byteWriter.close()
println result
在Ruby中尝试过类似的事情,结果是一样的。所以我认为问题在于文件格式不是Zlibbed。
答案 0 :(得分:5)
但是,如果我按照文章“Git tree objects, how are they stored?”,树内容并不是一个可读的字符串:
一般格式为:
- 声明对象类型的前4个字节。在我们的例子中,这四个字节是“树”,ASCII编码。
- 然后是一个空格,
- 然后是条目,没有任何分隔。
具体格式如下。所有大写字母都是“非终端”,我将在稍后解释。
tree ZN(A FNS)*
其中:
N
是NUL角色Z
是对象的大小(以字节为单位)A
是unix访问代码,ASCII编码,例如> 100644为香草文件。F
是文件名,(我不确定编码。它绝对是ASCII兼容的),NUL终止。
S is the 20 byte SHA hash of the entry pointed to, 20 bytes long.
这是一个例子 假设我们有一个包含两个文件的目录,名为
的输出中看到条目的SHA哈希值test
和test2
。目录的SHA为f0e12ff4a9a6ba281d57c7467df585b1249f0fa5
。您可以在
$ git cat-file -p f0e12ff4a9a6ba281d57c7467df585b1249f0fa5
100644 blob 9033296159b99df844df0d5740fc8ea1d2572a84 test
100644 blob a7f8d9e5dcf3a68fdd2bfb727cde12029875260b test2