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_delta
,delta.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/