【问题标题】:Git Packfile Entry Offset CalculationsGit Packfile 条目偏移量计算
【发布时间】: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 中的条目索引?

【问题讨论】:

    标签: git go zlib


    【解决方案1】:

    我以不同的方式解决了我的问题:我修改了 compress/zlib 以从 zlib 阅读器中公开摘要。解压后,我在原始 io.ReadSeeker 中向后搜索,找到用作压缩数据校验和的 4 字节摘要,以便知道压缩数据流的结尾在哪里。

    不过,为什么 git 和 Go 的 zlib 算法会在相同的压缩级别下产生不同的结果,我仍然没有答案。

    【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-04-01
    • 2018-04-13
    • 1970-01-01
    • 2013-08-24
    • 2021-04-10
    • 2021-10-14
    • 2018-08-27
    • 2018-03-31
    相关资源
    最近更新 更多