解压缩git树对象

Sta*_*sev 3 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
Run Code Online (Sandbox Code Playgroud)

在Ruby中尝试过类似的事情,结果是一样的.所以我认为问题在于文件格式不是Zlibbed.

Von*_*onC 5

但是如果我按照文章" Git树对象,它们是如何存储的? " 那么树的内容并不是一个可读的字符串:

一般格式是:

  • 前4个字节声明对象类型.在我们的例子中,这四个字节是"树",ASCII编码.
  • 然后是一个空间,
  • 然后是条目,没有任何分隔.

确切的格式如下.所有大写字母都是"非终端",我将在稍后解释.

tree ZN(A FNS)*
Run Code Online (Sandbox Code Playgroud)

哪里:

  • N 是NUL角色
  • Z 是以字节为单位的对象大小
  • A 是unix访问代码,ASCII编码,例如> 100644,用于vanilla文件.
  • F 是文件名,(我不确定编码.它绝对是ASCII兼容的),NUL终止.
S is the 20 byte SHA hash of the entry pointed to, 20 bytes long.
Run Code Online (Sandbox Code Playgroud)

这是一个例子.
假设我们有一个包含两个文件的目录,名为testtest2.目录的SHA是f0e12ff4a9a6ba281d57c7467df585b1249f0fa5.您可以在输出中看到条目的SHA哈希值

$ git cat-file -p f0e12ff4a9a6ba281d57c7467df585b1249f0fa5
100644 blob 9033296159b99df844df0d5740fc8ea1d2572a84    test
100644 blob a7f8d9e5dcf3a68fdd2bfb727cde12029875260b    test2
Run Code Online (Sandbox Code Playgroud)

树