【发布时间】:2016-02-07 19:25:10
【问题描述】:
我正在尝试解释从 git-upload-pack 收到的包文件。 git-upload-pack 不发送随附的索引,因为据说您可以从原始包文件中派生它,但我无法弄清楚包文件的格式是如何实现的。
git 技术文档说它有一个可变的字节数表示条目大小,但这是条目的未压缩大小,并且条目数据本身是用zlib压缩在pack文件中的. Go 的 zlib 实现是贪婪的,并且使用我给它的 io.Reader 寻找数据的末尾,这意味着我不能相信它在解压缩块后将 io.Reader 指针留在正确的位置。
我的第一个想法是在使用compress / zlib从packfile中读取压缩块之前取一个书签,读取后重置为书签,使用相同的算法/压缩级别重新压缩未压缩的数据,以便我知道长度压缩数据,然后向前搜索那么远以获得下一个块的正确偏移量。
但是,重新压缩的数据似乎与原始压缩数据不同。为什么用相同的算法压缩相同的数据会产生不同的结果?有没有更好的方法来计算 git packfile 中的条目索引?
【问题讨论】: