4

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

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

$ git cat-file -s 7daa9e75f86aa168748aef6c16c76b2acee1acca
61464170

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

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

7daa9e75f86aa168748aef6c16c76b2acee1acca blob   568352 529608 770759074 1 27e47895a3822906eb31b05fe674ad470296c12e

(此处提供了验证包输出的完整副本)

如您所见(在阅读文档git verify-pack),该对象存储为deltafied,列的定义如下:

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

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

4

3 回答 3

4

首先,看这张图。然后,根据来源 ( builtin/index-pack.c),第四个字段中的值为:

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

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

(要获得实际数据,甚至是它的大小,您必须稍微膨胀一下流,然后查看 delta 标头。对象的“真实”大小在标头中编码为第二个大小值。请参见get_size_from_deltain sha1_file.cget_delta_hdr_sizein delta.h、和图中的“偏移编码”。)


编辑添加:好的,重新阅读问题,您更多地询问为什么第四个尺寸比第三个小得多。那是因为第三个是对象的膨胀(但不是 de-delta-ed)大小。所以:size-in-packfile(字段4)是在放气之后,但也包含了一点头部开销;增量压缩文件(字段 3)的大小是显而易见的;最终文件的大小,在撤消 delta 压缩后,位于其字节数包含在 size-in-packfile(字段 4)中的标头中。

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

于 2013-08-02T12:18:23.870 回答
1

在 Git 2.21(2019 年第一季度)中,“objectsize”的含义得到了澄清,作为 的“ --format=<placeholder>”选项for-each-refbranch并且tag学会了显示更多可以通过 object_info API 学习的对象特征。

请参阅Olga Telezhnaya ( ) 的提交 59012fe提交 5610d9f提交 33311fa提交 f4ee22b提交 5305a55提交 1867ce6(2018 年 12 月 24 日(由Junio C Hamano 合并 -- --提交 55574bd中,2019 年 1 月 18 日)telezhnaya
gitster

ref-filter: 添加objectsize:disk选项

添加新的格式化选项objectsize:disk以了解对象在磁盘上占用的确切大小。

手册页现在git for-each-ref指出

objectsize:

对象的大小(与 ' git cat-file -s' 报告相同)。
追加:disk以获取对象在磁盘上占用的大小(以字节为单位)。

deltabase:

这将扩展为给定对象的增量基础的对象名称,如果它存储为增量。
否则,它会扩展为空对象名称(全为零)。

注意事项:

请注意,磁盘上对象的大小是准确报告的,但在得出关于哪些 ref 或对象负责磁盘使用的结论时应小心。
打包的非 delta 对象的大小可能远大于对其进行 delta 处理的对象的大小,但是选择哪个对象是基础对象和哪个对象是 delta 是任意的,并且在重新打包期间可能会发生变化

另请注意,对象数据库中可能存在对象的多个副本;在这种情况下,未定义将报告哪个副本的大小或增量基数。

因此,您可以将这些值与 报告的值进行比较git verify-pack -v,因为 agit for-each-ref现在(5 年后)能够显示更多数据。

于 2019-01-28T23:00:49.697 回答
0

最近有一个补丁系列[RFC/PATCH 0/4] cat-file --batch-disk-sizes 讨论,其中包括“[PATCH 07/10] cat-file: add %(objectsize:disk) format atom” 这可能如果您要从源代码编译,请感兴趣。

于 2013-08-02T18:34:38.177 回答