解压缩git树对象

时间:2013-07-28 15:50:37

标签: git

我写了一个小的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。

1 个答案:

答案 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.
  

这是一个例子   假设我们有一个包含两个文件的目录,名为testtest2。目录的SHA为f0e12ff4a9a6ba281d57c7467df585b1249f0fa5。您可以在

的输出中看到条目的SHA哈希值
$ git cat-file -p f0e12ff4a9a6ba281d57c7467df585b1249f0fa5
100644 blob 9033296159b99df844df0d5740fc8ea1d2572a84    test
100644 blob a7f8d9e5dcf3a68fdd2bfb727cde12029875260b    test2

tree