Git:git verify-pack返回的object 'size'的含义

标签 git

git verify-pack命令有一个 -v 选项,它为包文件中找到的每个对象输出大量诊断信息。但是,deltified 对象的 size 字段返回的值与我模糊的预期不符——我认为它应该类似于 Git 对象的未压缩“真实”大小?该字段的实际含义是什么?

具体来说,我有一个包含大对象的 Git 包文件:

$ git cat-file -s 7daa9e75f86aa168748aef6c16c76b2acee1acca
61464170

(即对象大小约为58MB,这确实是我查看文件时看到的)

但是,git verify-pack -v 为此对象返回的行是这样的:

7daa9e75f86aa168748aef6c16c76b2acee1acca blob   568352 529608 770759074 1 27e47895a3822906eb31b05fe674ad470296c12e

(验证包输出的完整副本可用 here)

如您所见(在阅读 the documentation for git verify-pack 之后),该对象被存储deltafied,列的定义是这样的:

SHA1 type size size-in-packfile offset-in-packfile depth base-SHA1

所以这个对象的“大小”是568352(而“size-in-packfile”是529608)——但这意味着什么,因为实际的对象大小是61464170 字节?大小的数量级差异一定意味着大小数字仅指增量?

最佳答案

首先,请参阅 this diagram .那么根据源码(builtin/index-pack.c),第四个字段的值为:

(unsigned long)(obj[1].idx.offset - obj->idx.offset)

这是原始打包后的大小(obj[1] 是此对象之后的下一个对象,或预告片)。当存储的项目被增量化时,这就是增量压缩数据的大小加上开销。第三个字段的值为obj->size(开销区域的第一个大小值)。

(要获取实际数据,甚至是它的大小,您必须稍微膨胀流,然后查看增量 header 。对象的“真实”大小在 header 中编码为 第二个 大小值。参见 sha1_file.c 中的 get_size_from_deltadelta.h 中的 get_delta_hdr_size,以及“offset图中的编码”。)


编辑添加:好的,重新阅读问题,您问的更多关于为什么第四种尺寸比第三种尺寸小得多。那是因为第三个是对象的膨胀(但不是去增量)大小。所以:size-in-packfile(字段 4)是在放气之后,但也包括一些头开销;增量压缩文件的大小(字段 3)很明显;撤销增量压缩后,最终文件的大小位于 header 中,其字节数包含在 size-in-packfile(字段 4)中。

额外编辑:offset-in-packfile(字段 5)是 obj->idx.offset。那就是你必须在包文件中 lseek() 开始读取对象的地方(我想,我面前有一些令人困惑的代码来处理 OBJ_OFS_DELTA :-)).

关于Git:git verify-pack返回的object 'size'的含义,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18010820/

相关文章:

git - 关于切换回空主分支的上游消失消息?

git - 使用git describe使Git在分支上显示正确的标签

git - 如何在使用 Github 还原按钮还原 PR 后再次 PR 和 merge

git - 更新我在 github 上的存储库

git - 为什么 git 将文件内容存储为 blob?