我正在尝试跟踪我正在处理的项目的大小.是否有一种简单的方法可以在不同分支的磁盘上获得repo大小.我试过了
git count-objects -v
Run Code Online (Sandbox Code Playgroud)
但它为每个分支提供相同的回购大小.
Von*_*onC 18
在 Git 2.31(2021 年第一季度)中,“ git rev-list” ( man )命令学习了--disk-usage选项。
它有很多示例,但是关于分支大小,现在的命令是:
git rev-list --disk-usage=human --objects HEAD..<branch_name>
Run Code Online (Sandbox Code Playgroud)
对于所有分支机构:
git rev-list --disk-usage=human --objects HEAD..<branch_name>
Run Code Online (Sandbox Code Playgroud)
请参阅Jeff King提交的提交 a1db097、提交 669b458(2021 年 2 月 17 日)和提交 16950f8、提交 3803a3a(2021 年 2 月 9 日)。(由Junio C Hamano 合并 -- --在提交 6fe12b5中,2021 年 2 月 25 日)peff
gitster
rev-list: 添加 --disk-usage 选项来计算磁盘使用情况签署人:杰夫·金
有时查看哪些引用对整个存储库大小有贡献是有用的(例如,某个分支是否有一堆在历史记录中其他地方找不到的对象,这表明删除它会缩小克隆的大小)。
您可以通过生成对象列表、从 cat 文件获取它们的大小,然后对它们求和来找到这一点,例如:
Run Code Online (Sandbox Code Playgroud)git rev-list --objects --no-object-names main..branch git cat-file --batch-check='%(objectsize:disk)' | perl -lne '$total += $_; END { print $total }'但请注意, git-cat-file(1) 中的警告适用于此处。
我们更多地“责怪”基础对象而不是它们的增量,尽管这种关系很容易被颠倒。
尽管如此,这仍然是一个有用的粗略衡量标准。但有一个问题是运行速度很慢。
教导 rev-list 来总结大小可以更快,原因有两个:
- 它跳过所有对象名称和大小的管道。
- 如果使用位图,对于位图包文件中的对象,我们可以
oid_object_info()完全跳过查找,而只需询问 revindex 的磁盘大小。该补丁实现了一个
--disk-usage选项,可以在很短的时间内产生相同的答案。
以下是使用 torvalds/linux 克隆的一些计时:Run Code Online (Sandbox Code Playgroud)[rev-list piped to cat-file, no bitmaps] $ time git rev-list --objects --no-object-names --all | git cat-file --buffer --batch-check='%(objectsize:disk)' | perl -lne '$total += $_; END { print $total }' 1459938510 real 0m29.635s user 0m38.003s sys 0m1.093s [internal, no bitmaps] $ time git rev-list --disk-usage --objects --all 1459938510 real 0m31.262s user 0m30.885s sys 0m0.376s尽管挂钟时间由于并行性而稍微差一点,但请注意两者之间的 CPU 节省。
仅通过避免使用管道,我们就节省了 21% 的 CPU 资源。但真正的胜利在于位图。
如果我们在没有新选项的情况下使用它们:Run Code Online (Sandbox Code Playgroud)[rev-list piped to cat-file, bitmaps] $ time git rev-list --objects --no-object-names --all --use-bitmap-index | git cat-file --batch-check='%(objectsize:disk)' | perl -lne '$total += $_; END { print $total }' 1459938510 real 0m6.244s user 0m8.452s sys 0m0.311s那么我们可以更快地生成对象列表,但我们仍然花费大量时间进行管道传输和查找。
但如果我们一起做:Run Code Online (Sandbox Code Playgroud)[internal, bitmaps] $ time git rev-list --disk-usage --objects --all --use-bitmap-index 1459938510 real 0m0.219s user 0m0.169s sys 0m0.049s然后我们就能更快地得到相同的答案。
当然,对于“--all”,该答案将与“du object/pack”密切对应。
但我们实际上在这里检查可达性,因此当我们要求更有趣的事情时我们仍然很快:Run Code Online (Sandbox Code Playgroud)$ time git rev-list --disk-usage --use-bitmap-index v5.0..v5.10 374798628 real 0m0.429s user 0m0.356s sys 0m0.072s
rev-list-options现在包含在其手册页中:
--disk-usage抑制正常输出;相反,打印所选提交或对象用于磁盘存储的字节总和。这相当于将输出通过管道传输到 中
git cat-file --batch-check='%(objectsize:disk)',只不过它运行得更快(尤其是使用 时--use-bitmap-index)。有关“磁盘存储”含义的限制,请参阅CAVEATS中的部分。git cat-file
在 Git 2.38(2022 年第 3 季度)中,“ git rev-list --disk-usage” ( man )学会了采用可选值human以人类可读的格式显示报告的值,例如“ 3.40MiB”。
请参阅Li Linchao ( )的提交 9096451(2022 年 8 月 11 日)。(由Junio C Hamano 合并 -- --在提交 fddd8b4中,2022 年 8 月 18 日)Cactusinhand
gitster
rev-list:支持人类可读的输出--disk-usage签字人:李林超
( man )
--disk-usage的' ' 选项是在16950f8中引入的(“ : ( man )计算磁盘使用情况的选项”,2021-02-09,Git v2.31.0-rc0 -- merge)。git-rev-listrev-listadd--disk-usage这对于人们检查其 git 存储库对象使用信息非常有用,但结果数字对于人类来说很难阅读。
教导
git rev-list在使用“--disk-usage = human”时输出人类可读的结果。
rev-list-options现在包含在其手册页中:
使用可选值 时
human,磁盘存储大小以人类可读的字符串形式显示(例如12.24 Kib,3.50 Mib)。
在 Git 2.43(2023 年第 4 季度)中,“ git for-each-ref --sort=contents:size( man ) ”根据大小对引用进行数字排序,给出指向十二字节 (12) 长的 blob 的引用,然后再显示一百字节 (100) 长的 blob。
请参阅Kosik Sanagavarapu ( )的提交 6d79cd8(2023 年 9 月 2 日)。(由Junio C Hamano 合并 -- --在提交 6a4e744中,2023 年 9 月 14 日)five-sh
gitster
ref-filter::size使用“ ”时按数字排序帮助者:Jeff King
签署者:Kousik Sanagavarapu
raw像“ ”和“ ”这样的原子contents有一个“:size”选项,可以用来知道数据的大小。
由于这些原子具有 ,因此cmp_typeFIELD_STR,它们按字母顺序从“a”到“z”以及“0”到“9”排序。
这意味着,即使使用“:size”选项并且我们最终得到的是数字,我们仍然按字母顺序排序。例如,考虑存储库中的以下情况
Run Code Online (Sandbox Code Playgroud)refname contents:size raw:size ======= ============= ======== refs/heads/branch1 1130 1210 refs/heads/master 300 410 refs/tags/v1.0 140 260用“
--format="%(refname) %(contents:size) --sort=contents:size”排序会给出Run Code Online (Sandbox Code Playgroud)refs/heads/branch1 1130 refs/tags/v1.0.0 140 refs/heads/master 300
这是按字母顺序排序的,而人们真正期望的是:
Run Code Online (Sandbox Code Playgroud)refs/tags/v1.0.0 140 refs/heads/master 300 refs/heads/branch1 1130这是数字排序(即“
$ sort -n file”而不是“$ sort file”,其中“file”仅包含“contents:size”或“raw:size”信息,每个信息都位于换行符上)。“ ”的情况也是如此
--sort=raw:size。因此,每当使用“contents:size”或“raw:size”完成排序时,请按数字排序,并在“contents”或“raw”与其他选项一起使用时按正常字母顺序进行排序(无论如何
FIELD_STR)。
这个问题真的没有意义——在 git 中,分支不是单独存储的。相反,有一个提交网络,基本上只存储差异。分支只是指向此提交网络中特定提交的指针。因此,一般而言,分支机构共享许多相同的信息。
如果您想知道单个分支的磁盘空间大小,这意味着如果某人克隆仅采用该分支的存储库所需的最小磁盘空间量,最简单的方法可能就是像这样制作一个存储库,然后询问该回购的大小。
这是一件非常丑陋的事:
$ git rev-list HEAD | # list commits
xargs -n1 git ls-tree -rl | # expand their trees
sed -e 's/[^ ]* [^ ]* \(.*\)\t.*/\1/' | # keep only sha-1 and size
sort -u | # eliminate duplicates
awk '{ sum += $2 } END { print sum }' # add up the sizes in bytes
Run Code Online (Sandbox Code Playgroud)
这将只计算blob(不提交,树,其他),并且不会考虑打包或跨分支对象共享.但它可以作为有用的东西的基础.
可粘贴版本:
git rev-list HEAD | xargs -n1 git ls-tree -rl | sed -e 's/[^ ]* [^ ]* \(.*\)\t.*/\1/' | sort -u | awk '{ sum += $2 } END { print sum }'
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
5788 次 |
| 最近记录: |