我正在尝试解释从git-upload-pack收到的packfile。 git-upload-pack不会发送附带的索引,因为据说你可以从原始的packfile中派生它,但是我无法弄清楚packfile的格式是如何实现的。
git技术文档说它有一个可变数量的字节,表示条目大小,但这是条目的未压缩大小,条目数据本身是用zlib在包文件中压缩的。 Go的zlib实现是贪婪的,并且使用我给它的io.Reader寻找超过数据的结尾,这意味着我不能相信它在解压缩块后将io.Reader指针留在正确的位置。
我的第一个想法是在使用compress / zlib从packfile读取压缩块之前获取书签,在读取后重置为书签,使用相同的算法/压缩级别重新压缩未压缩的数据,以便我知道长度压缩数据,然后向前寻找到达下一个块的正确偏移量。
但是,重新压缩的数据似乎与原始压缩数据不同。为什么使用相同算法压缩的相同数据会产生不同的结果?有没有更好的方法来计算git packfile中的条目索引?
答案 0 :(得分:0)
我以不同的方式解决了我的问题:我修改了compress / zlib以从zlib阅读器中公开摘要。解压缩后,我在原始的io.ReadSeeker中向后搜索,找到用作压缩数据校验和的4字节摘要,以便知道压缩数据流的结束位置。
我仍然没有答案为什么git和Go的zlib算法会在相同的压缩级别下产生不同的结果。