git verify-pack命令有一个-v
选项,它为packfile中找到的每个对象输出大量诊断信息。但是,size
字段为一个经过验证的对象返回的值与我的朦胧期望不符 - 我认为它会像Git对象的未压缩'true'大小?这个领域的实际意义是什么?
具体来说,我有一个包含大对象的Git包文件:
$ git cat-file -s 7daa9e75f86aa168748aef6c16c76b2acee1acca
61464170
(即对象大小约为58MB,这确实是我在检查文件时看到的内容)
但是,git verify-pack -v
为此对象返回的行是:
7daa9e75f86aa168748aef6c16c76b2acee1acca blob 568352 529608 770759074 1 27e47895a3822906eb31b05fe674ad470296c12e
(验证包输出的完整副本可用here)
正如您所看到的(在git verify-pack
阅读the documentation后),此对象存储在 deltafied 中,列的定义如下:
SHA1 type size size-in-packfile offset-in-packfile depth base-SHA1
此对象的“大小”为 568352 ('size-in-packfile'为529608) - 但这意味着什么,假设实际对象大小为 61464170 < / strong>字节?大小顺序差异必须意味着大小数字仅指delta?
答案 0 :(得分:4)
首先,请参阅this diagram。然后,根据源(builtin/index-pack.c
),第四个字段中的值为:
(unsigned long)(obj[1].idx.offset - obj->idx.offset)
这是原始打包大小(obj[1]
是此之后的下一个对象,或预告片)。当存储的项目被分层时,这是增量压缩数据的大小加上开销。第三个字段中的值为obj->size
(来自开销区域的第一个大小值)。
(要获取实际数据,甚至是它的大小,你必须稍微膨胀一下流然后查看delta标题。对象的“true”大小在标题中编码为 second 尺寸值。请参阅get_size_from_delta
中的sha1_file.c
,get_delta_hdr_size
中的delta.h
和图表中的“偏移编码”。)
编辑添加:好的,重新阅读问题,你要问的是为什么第四个尺寸比第三个尺寸小得多。那是因为第三个是对象的膨胀(但不是去三角洲)大小。所以:size-in-packfile(字段4)在放气之后,还包括一些标头开销; delta压缩文件的大小(字段3)很明显;在撤消增量压缩之后,最终文件的大小和数据位于标题中,其字节数包含在size-in-packfile中(字段4)。
额外编辑:offset-in-packfile(字段5)为obj->idx.offset
。这就是你必须在包文件中lseek()
开始阅读对象的地方(我想,我面前也有一些令人困惑的代码来处理OBJ_OFS_DELTA
:-))。
答案 1 :(得分:1)
在Git 2.21(2019年第一季度)中,“ objectsize”的含义得以阐明,因为--format=<placeholder>
,for-each-ref
和branch
的“ tag
”选项显示对象可以通过object_info API学习的更多特征。
请参见commit 59012fe,请参见commit 5610d9f,commit 33311fa,commit f4ee22b,commit 5305a55,commit 1867ce6,Olga Telezhnaya (telezhnaya
)(2018年12月24日) 。
(由Junio C Hamano -- gitster
--在commit 55574bd中合并,2019年1月18日)
ref-filter
:添加objectsize:disk
选项添加新的格式设置选项
objectsize:disk
,以了解对象在磁盘上占用的确切大小。
git for-each-ref
man page now states:
objectsize:
对象的大小(与“
git cat-file -s
”报告相同)。
附加:disk
以获得对象在磁盘上占用的大小(以字节为单位)。deltabase:
如果将其存储为增量,则扩展为给定对象的增量基础的对象名称。
否则,它将扩展为空对象名称(全零)。注意事项:
请注意,磁盘上对象的大小是准确报告的,但是在得出哪些引用或对象与磁盘使用有关的结论时应格外小心。
打包的非增量对象的大小可能远大于与之相对的对象的大小,但是选择哪个对象是基础对象和哪个增量是任意的,并且在重新打包期间可能会发生变化。还请注意,对象数据库中可能存在一个对象的多个副本;在这种情况下,尚不确定将报告哪个副本的大小或底数。
因此,您可以将这些值与git verify-pack -v
报告的值进行比较,因为git for-each-ref
现在(超过5年后)可以显示更多数据。
答案 2 :(得分:0)
最近有一个补丁系列[RFC/PATCH 0/4] cat-file --batch-disk-sizes讨论,其中包括"[PATCH 07/10] cat-file: add %(objectsize:disk) format atom",如果您要从源代码编译,可能会感兴趣。