用于Windows Blob压缩的Git

问题描述 投票:0回答:1

我正在尝试创建一个与GIT for Windows创建的原始git存储库一起工作的工具。我需要从.git/objects目录解压缩原始对象。这是对象的十六进制转储:

00000000  78 01 2b 29 4a 4d 55 30 36 63 30 34 30 30 33 31  |x.+)JMU06c040031|
00000010  51 c8 4d cc cc d3 2b a9 28 61 e8 a9 8b 4a ab 97  |QÈMÌÌÓ+©(aè©.J«.|
00000020  2e 97 70 ff d7 71 40 c6 f6 b1 8b f0 c2 4d 0a 00  |..pÿ×q@Æö±.ðÂM..|
00000030  33 56 0f 42                                      |3V.B|

如果我使用GIT for Windows转储它,我会收到以下内容:

$ git cat-file -p 9171a57695205f9d7f03f1d2872b110b0ee538e9
100644 blob 8c7e5a667f1b771847fe88c01c3de34413a1b220    main.txt

当我尝试使用DotNetZip libraryan online tool对其进行解压缩时,它不能正确解压缩。我的程序在尝试解压缩时产生的输出是:

00000000  74 72 65 65 20 33 36 00 31 30 30 36 34 34 20 6d  |tree 36.100644 m|
00000010  61 69 6e 2e 74 78 74 00 8c 7e 5a 66 7f 1b 77 18  |ain.txt..~Zf..w.|
00000020  47 fe 88 c0 1c 3d e3 44 13 a1 b2 20              |Gþ.À.=ãD.¡² |

我知道git cat-file剥离了对象标题,所以这是一个区别,但为什么对象的其余部分没有正确膨胀?

我以前尝试膨胀的代码取决于nuget包“Zlib.Portable.Signed”:

using Ionic.Zlib;
using System.IO;

namespace TestInflate
{
    class Program
    {
        static void Main(string[] args)
        {
            using (var lFrom = File.OpenRead("IN"))
            using (var lInflate = new ZlibStream(lFrom, CompressionMode.Decompress))
            using (var lTo = File.Create("OUT"))
                lInflate.CopyTo(lTo);
        }
    }
}
c# git zlib
1个回答
0
投票

根据评论,您的解压缩程序很好。问题是您正在检查引用子树和blob的树对象。

所有对象都以一个标题开头,给出了对象的类型,以及以字节为单位的整体大小,但表示为ASCII字符串。所以tree 36表明这是一棵树,树长36个字节。接下来是ASCII NUL,0x00或CTRL- @。之后是树条目。

每个条目都具有表单模式空间名称CTRL- @hash。散列是二进制的,并且总是正好20个字节长(至少在Git切换到新的散列之前;如何指示和编码,尚未确定)。你的mode100644而你的namemain.txt,所以你有6 + 1 + 8 + 1 + 20 = 36个字节,这是标题中的长度,所以这就是整个树。

© www.soinside.com 2019 - 2024. All rights reserved.