获取 Git 分支大小

2023-12-21

我正在尝试跟踪我正在进行的项目的规模。有没有一种简单的方法来获取不同分支的磁盘上的存储库大小?

I tried

git count-objects -v

但它为每个分支提供相同的存储库大小。


With Git 2.31 (Q1 2021), "git rev-list https://github.com/git/git/blob/6fe12b5215f4ca597accc97ac5dce0f88e8483e9/Documentation/git-rev-list.txt"(man https://git-scm.com/docs/git-rev-list) command learned --disk-usage option.

它有一个很多例子 https://github.com/git/git/commit/a1db097e107749cf6f1c2dc878c615ca2d3fb314,但关于分支大小,现在的命令是:

git rev-list --disk-usage=human --objects HEAD..<branch_name>

对于所有分支机构:

/* Report the disk size of each branch, not including objects used by the
  current branch. This can find outliers that are contributing to a
  bloated repository size (e.g., because somebody accidentally committed
  large build artifacts).
*/

git for-each-ref --format='%(refname)' |
while read branch
do
    size=$(git rev-list --disk-usage --objects HEAD..$branch)
    echo "$size $branch"
done |
sort -n

See commit a1db097 https://github.com/git/git/commit/a1db097e107749cf6f1c2dc878c615ca2d3fb314, commit 669b458 https://github.com/git/git/commit/669b4587555597da7f2a875b95dc50f503b8187f (17 Feb 2021), and commit 16950f8 https://github.com/git/git/commit/16950f8384afa5106b1ce57da07a964c2aaef3f7, commit 3803a3a https://github.com/git/git/commit/3803a3a0993045605d7f3db363188ce377e917c8 (09 Feb 2021) by Jeff King (peff) https://github.com/peff.
(Merged by Junio C Hamano -- gitster -- https://github.com/gitster in commit 6fe12b5 https://github.com/git/git/commit/6fe12b5215f4ca597accc97ac5dce0f88e8483e9, 25 Feb 2021)

rev-list https://github.com/git/git/commit/16950f8384afa5106b1ce57da07a964c2aaef3f7: 添加 --disk-usage 选项来计算磁盘使用情况

Signed-off-by: Jeff King

有时查看哪些引用对整个存储库大小有贡献是有用的(例如,某个分支是否有一堆在历史记录中其他地方找不到的对象,这表明删除它会缩小克隆的大小)。

您可以通过生成对象列表、从 cat 文件获取它们的大小,然后对它们求和来找到这一点,例如:

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 来总结大小可以更快,原因有两个:

  1. 它跳过所有对象名称和大小的管道。
  2. 如果使用位图,对于位图包文件中的对象,我们可以跳过oid_object_info()完全查找,只需向 revindex 询问磁盘上的大小即可。

该补丁实现了--disk-usage在很短的时间内产生相同答案的选项。
以下是使用 torvalds/linux 克隆的一些计时:

[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 资源。

但真正的胜利在于位图。
如果我们在没有新选项的情况下使用它们:

[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

那么我们可以更快地生成对象列表,但我们仍然花费大量时间进行管道和查找。
但如果我们一起做:

[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”密切对应。
但我们实际上在这里检查可达性,因此当我们要求更有趣的事情时我们仍然很快:

$ 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现在包含在其man page https://github.com/git/git/blob/16950f8384afa5106b1ce57da07a964c2aaef3f7/Documentation/rev-list-options.txt#L230-L238:

--disk-usage

抑制正常输出;相反,打印所用字节的总和 用于所选提交或对象的磁盘存储。这是 相当于将输出通过管道输送到git cat-file --batch-check='%(objectsize:disk)',除了它运行很多 更快(尤其是--use-bitmap-index)。请参阅CAVEATS部分在git cat-file https://git-scm.com/docs/git-cat-file对于什么的限制 “磁盘存储”的意思。


With Git 2.38 (Q3 2022), "git rev-list --disk-usage https://github.com/git/git/blob/fddd8b4801b51234b2dd525c35d74e2a578638fd/Documentation/rev-list-options.txt#L244"(man https://git-scm.com/docs/git-rev-list#Documentation/git-rev-list.txt---disk-usage) learned to take an optional value human to show the reported value in human-readable format, like "3.40MiB".

See commit 9096451 https://github.com/git/git/commit/9096451acdf065c3dbcf609dcefe51cd68aa5d1e (11 Aug 2022) by Li Linchao (Cactusinhand) https://github.com/Cactusinhand.
(Merged by Junio C Hamano -- gitster -- https://github.com/gitster in commit fddd8b4 https://github.com/git/git/commit/fddd8b4801b51234b2dd525c35d74e2a578638fd, 18 Aug 2022)

rev-list https://github.com/git/git/commit/9096451acdf065c3dbcf609dcefe51cd68aa5d1e:支持人类可读的输出--disk-usage

Signed-off-by: Li Linchao

The '--disk-usage' option for git-rev-list https://github.com/git/git/blob/9096451acdf065c3dbcf609dcefe51cd68aa5d1e/Documentation/git-rev-list.txt(man https://git-scm.com/docs/git-rev-list) was introduced in 16950f8 https://github.com/git/git/commit/16950f8384afa5106b1ce57da07a964c2aaef3f7 ("rev-list: add https://github.com/git/git/blob/16950f8384afa5106b1ce57da07a964c2aaef3f7/Documentation/git-add.txt(man https://git-scm.com/docs/git-add) --disk-usage option for calculating disk usage", 2021-02-09, Git v2.31.0-rc0 -- merge https://github.com/git/git/commit/6fe12b5215f4ca597accc97ac5dce0f88e8483e9).

这对于人们检查其 git 存储库对象使用信息非常有用,但结果数字对于人类来说很难阅读。

Teach git rev-list使用“--disk-usage = human”时输出人类可读的结果。

rev-list-options现在包含在其man page https://github.com/git/git/blob/9096451acdf065c3dbcf609dcefe51cd68aa5d1e/Documentation/rev-list-options.txt#L253-L254:

具有可选值human,显示磁盘存储大小 以人类可读的字符串形式(例如12.24 Kib, 3.50 Mib).


With Git 2.43 (Q4 2023), "git for-each-ref --sort=contents:size https://github.com/git/git/blob/6a4e7440fb4b20822e1854925c0dcfae0c64402d/Documentation/git-for-each-ref.txt#L46"(man https://git-scm.com/docs/git-for-each-ref#Documentation/git-for-each-ref.txt---sortltkeygt)" sorts the refs according to size numerically, giving a ref that points at a blob twelve-byte (12) long before showing a blob hundred-byte (100) long.

See commit 6d79cd8 https://github.com/git/git/commit/6d79cd8474b7bb4979f2a7544fd736bed190261a (02 Sep 2023) by Kousik Sanagavarapu (five-sh) https://github.com/five-sh.
(Merged by Junio C Hamano -- gitster -- https://github.com/gitster in commit 6a4e744 https://github.com/git/git/commit/6a4e7440fb4b20822e1854925c0dcfae0c64402d, 14 Sep 2023)

ref-filter https://github.com/git/git/commit/6d79cd8474b7bb4979f2a7544fd736bed190261a:当“时按数字排序:size“ 用来

Helped-by: Jeff King
Signed-off-by: Kousik Sanagavarapu

原子像“raw" and "contents“ 有一个 ”:size" 选项可用于了解数据的大小。
由于这些原子具有cmp_type FIELD_STR,它们按字母顺序从“a”到“z”以及“0”到“9”排序。
这意味着,即使使用“:size”选项并且我们最终得到的是数字,我们仍然按字母顺序排序。

例如,考虑存储库中的以下情况

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“ 会给

refs/heads/branch1 1130
refs/tags/v1.0.0   140
refs/heads/master  300

这是按字母顺序排序的,而人们真正期望的是:

refs/tags/v1.0.0   140
refs/heads/master  300
refs/heads/branch1 1130  

这是数字排序(即“$ sort -n file“而不是”$ sort file“, 在哪里 ”file“仅包含”contents:size" or "raw:size“信息,每个信息都在换行符上)。

情况与“--sort=raw:size".

因此,只要使用“contents:size”或“raw:size”完成排序,就按数字排序,并在“contents”或“raw”与其他选项一起使用时按正常字母顺序进行排序(它们是FIELD_STR无论如何)。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

获取 Git 分支大小 的相关文章

  • Git:在本地合并远程分支

    我已经通过以下方式拉取了所有远程分支git fetch all 我可以看到我想要合并的分支git branch a作为远程 原点 分支名称 问题是它无法访问 我无法合并或结帐 您可以参考那些远程跟踪分支 列出git branch r 及其遥
  • git 分叉是如何工作的?

    所以我登录了 github 并 fork 了一个项目 每次原始存储库更新时 我的分叉存储库都会更新吗 或者我应该每次都从原始存储库进行分叉 这样我就不会错过对原始存储库所做的任何新更改 分叉是存储库的副本 分叉存储库允许您自由地尝试更改 而
  • Windows 中的 Git Shell:补丁的默认字符编码是 UCS-2 Little Endian - 如何将其更改为 ANSI 或 UTF-8 without BOM?

    当创建一个Windows 中使用 Git Shell 进行差异补丁 当使用适用于 Windows 的 GitHub http windows github com the 字符编码补丁的UCS 2 小尾数法根据Notepad 参见下面的屏幕
  • GitLab CI - 添加标签时避免构建

    添加 git 标签时如何防止触发 gitlab ci 管道 我在本地运行此命令 而不是在 gitlab ci 作业中运行 git tag a xyz 然后推送标签 这会触发各种管道 我想排除其中一些管道的运行 我正在尝试对诸如以下问题的想法
  • Github 版本如何生成存档文件名?

    我刚刚在 github 上为我的 NFQL 软件创建了版本 这是发布页面 https github com vbajpai nfql releases https github com vbajpai nfql releases 对于最新版
  • Git - 显示远程分支的远程名称

    是否有一个 Git 命令可以显示远程分支的远程名称 目前 我坚持使用 shell utils 从远程分支引用中提取远程名称 例如 echo remote name branch name sed r s 1 remote name 有时出于
  • 恢复 git reset --soft

    我修改了我的分支中的一些文件并做了一个 git add all 但这添加了一些我不打算为提交添加的文件 所以我做了一个 git reset soft HEAD 2 instead of doing git reset HEAD 但之前的提交
  • 我可以从命令行向 github 添加问题吗?

    我是 git 新手 我希望能够通过 github 绘制我的项目的计划和进度 问题是 这需要在 github com 上使用浏览器进行大量点击 并且我希望能够通过使用命令行程序来自动执行该任务 github 有命令行界面吗 有一个ghi ge
  • 将 svn 存储库添加到现有的 git 存储库中?

    我知道你可以使用 git svn init 来跟踪 svn 存储库 但这是为了你想创建一个全新的存储库 我的情况是 我目前已经有一个现有的 git 存储库 并且希望通过将 svn 存储库设为我当前 git 存储库中的远程分支来跟踪 svn
  • 使用 Subversion 进行部分提交

    鉴于我做的案例两个独立的变化 in one文件 例如 添加了一个新方法并更改了另一个方法 我经常不想提交这两项更改 因为one提交 但作为two独立承诺 在 git 存储库上我会使用互动模式 of git 添加 1 http linux d
  • 如何使用“gem install”命令从私有 GitHub 存储库安装 gem

    如何在本地安装托管在 GitHub 上的私人存储库中的 gem 特别是 我们通过gem install命令而不是在 Bundler 中使用 因为它是一个命令行工具 我尝试这样做 gem install githubname repo s h
  • hg 或 git 中的两个完整目录/项目之间存在差异?

    我继承了一个最初存储在 CVS 中的项目以及所有修订 我做了相当多的编辑 并且我试图比较我在原始目录中所做的所有更改 关于添加的新文件与旧文件 hg git 是否有某种实用程序可以让我进行树差异或类似性质的操作 也就是说 新添加的文件 删除
  • 如何使用 sourceTree 进行推送?

    我正在使用 sourceTree 管理 Unity 项目 版本 4 6 3 我只是想返回到上一次提交 右键选择 将当前分支重置到此提交 在使用模式中选择 硬 然后放回上一次提交 之后 我尝试去推 但没有成功 抱歉 当时我忘记了错误 之后 我
  • 通过链接进入 git-repo,无需冗长的对话框

    In a directory I have symbolic links into a git administered directory all under Linux Every time I want to e dit such a
  • 当出现错误时如何删除远程分支?

    我尝试过以下命令 但失败了 git push origin next remote error denying ref deletion for refs heads next To blah git remote rejected nex
  • 返回到存储库中的特定修订后提交并推送更改?

    我们需要及时返回到某个特定的提交 一些意外的改变是为了掌握 尝试恢复它挖得太深 所以 master 的状态很糟糕 现在我们希望master回到66ada4cc61d62afc 根据git 恢复到某个提交 https stackoverflo
  • 如何使用 vim 作为“git show”编辑器?

    全部如所述如何使用 vim 作为 git log 编辑器 https stackoverflow com questions 16666009 how do i use vim as git log editor不适用于 git show
  • 如何在Windows上分离“Git bash”中启动的“git gui”?

    例如 我开始 git bash 我导航到某个目录 I start git gui 我关闭控制台窗口或按 Ctrl C Git gui 的窗口消失了 即使我用过git gui disown 即使当我按 Ctrl C 时它不在前台 如何正确分离
  • 在 Web 应用程序中显示最新的提交值?

    我有一些 Rails 应用程序 我使用 Git 作为版本控制系统 我使用 GitHub 或 Beanstalk 作为存储库主机 从理论上讲 我想要做的事情非常简单 以某种方式在 Web 应用程序的页脚中显示最新的提交 ID 号 哈希值 这样
  • gitlab 请求将分支 A 合并到开发中(落后 3 次提交)我应该担心吗?

    在 gitlab 中创建合并请求时 我经常收到一条消息 请求将分支 A 合并到开发中 x 提交落后 gitlab想告诉我什么 我应该担心还是需要修复某些东西 什么 一段时间后合并请求在项目中打开时 由于其他人合并了自己的更改 您尝试合并到的

随机推荐

  • as3 播放影片剪辑一次

    如果您帮助我解决这个问题 我将非常感激 我正在尝试在 ipad 应用程序中播放一次 MovieClip 我试图以这种方式停止 但电影不会停止 var loader Loader new Loader var swfFile URLReque
  • PHP - 将 2d 数组转换为按特定值分组的 3d 数组的最快方法

    我想转换这个二维记录数组 records gt Array 0 gt Array 0 gt Pears 1 gt Green 2 gt Box 3 gt 20 1 gt Array 0 gt Pears 1 gt Yellow 2 gt P
  • 数据表列未对齐和重复排序箭头问题

    每次我显示表格时 我都会在表格中添加一个额外的排序箭头 th Here is an image of the issue I also am having an issue with my columns not aligning corr
  • Spring Security 和多部分请求

    我有一个受 Spring Security 和 OAuth2 保护的 Controller 我试图让我的用户上传文件 Controller RequestMapping value api image public class ImageC
  • OpenCV:选择颜色过滤的 HSV 阈值

    为了从图像中过滤出某种颜色 有必要设置需要检测的颜色的边界 我有一种感觉 这主要是一个试错过程 有没有什么方法可以快速找到特定颜色的正确阈值 在这种特定情况下 我试图检测下图中图表的灰色区域 当然 这没有检测到虚线 对于这个例子 我需要非常
  • 如何在 NSPasteBoard cocoa os x 中复制图像?

    I have tried this one but not working NSPasteboard pboard NSPasteboard generalPasteboard pboard declareTypes NSMutableAr
  • 网络设备发现

    对于我的 Android 应用程序 用户需要连接到托管在同一 LAN 上某处的服务器 同一 LAN 上可以托管多个服务器 为了方便用户 我打算扫描 Android 设备当前连接的 LAN 然后列出所有运行服务器的网络设备 而不是让用户将 I
  • 发布请求被切断

    我的 javascript 发布请求有问题 我有以下代码用于发送帖子请求 var xhttp new XMLHttpRequest xhttp onreadystatechange function if this readyState 4
  • Spark 和 Cassandra Java 应用程序:线程“主”java.lang.NoClassDefFoundError 中出现异常:org/apache/spark/sql/Dataset

    我得到了一个令人惊奇的 siplme java 应用程序 我几乎从这个例子中复制了它 我想做的就是读取表数据并显示在 Eclipse 控制台中 我的 pom xml
  • 减少 Android 应用程序 (apk) 的大小

    我现在将在 Google Play 商店上发布我的第一个应用程序 我已经压缩了我的应用程序中使用的图像 我对应用程序大小有一些疑问 如果应用程序的大小小于 2 MB 则用户卸载该应用程序的可能性较小 对于属于教育领域的应用程序 我的这种说法
  • 一个 Hive 脚本可以从另一个 Hive 脚本运行吗?

    我创建了两个配置单元脚本 script1 hql 和 script2 hql 是否可以从 script1 hql 运行脚本 script2 hql 我读到了有关使用 source 命令的信息 但无法回避它的使用 任何指针 参考文档将不胜感激
  • 如何使用“Entity Framework Core”(又名 EF7)实现“软删除”?

    我正在尝试使用 EF7 实现 软删除 我的Item表有一个名为IsDeleted类型的bit 我在 SO 和其他地方看到的所有例子都使用这样的东西 protected override void OnModelCreating ModelB
  • PHPExcel 获取相对于给定列的列名

    使用 PHPExcel 是否可以获取位于左侧或右侧 X 列的列的名称 例如 给定列 BZ 我想返回列名称 CB 或 BX 向右或向左 2 个 Thanks PHPExcel 中已经内置了一些函数来帮助您执行此操作 adjustment 2
  • 进行多线程 foreach 循环的最佳方法[关闭]

    Closed 这个问题需要多问focused help closed questions 目前不接受答案 我有一个带有 foreach 的发送电子邮件方法 如下所示 static void Main string args foreach
  • 创建一个可供 Android 中所有 Activity 访问的对象

    我正在尝试创建一个包含对象的数据数组列表 例如地址和属性列表 非常复杂 并且想知道 如何使所有活动都可以访问 和可编辑 一个对象 而不仅仅是它本身实例化于 基本上是这样的 在活动 1 中创建数组 在活动 2 和活动 3 中访问相同的数组 P
  • 以编程方式打开组合框下拉列表[重复]

    这个问题在这里已经有答案了 是否有可能directly以编程方式打开 WindowsForms 组合框 还没有找到这样做的方法或属性 如果没有 有哪些可能的解决方案不涉及大量黑客攻击 Use ComboBox DroppedDown htt
  • Unix/Linux 系统调用是 POSIX 库函数的一部分吗?

    Unix Linux 系统调用全部或大部分是 POSIX 中的吗 许多Linux Unix编程书籍都说POSIX库函数可能是OS系统调用的包装器 也可能不是 例如 http www makelinux net books lkd2 ch05
  • jquery获取矩形宽度和高度传单

    我有一张地图和一个区域选择字段 initialize map var map L map map setView 38 0 2 L tileLayer http s tile cloudmade com 70146506bc514228ad
  • 使用 Python BaseHTTPServer 处理同时/异步请求

    我通过创建一个继承自 HTTPServer 和 ThreadingMixIn 的类来设置一个线程 使用 Python 线程 HTTP 服务器 class ThreadedHTTPServer ThreadingMixIn HTTPServe
  • 获取 Git 分支大小

    我正在尝试跟踪我正在进行的项目的规模 有没有一种简单的方法来获取不同分支的磁盘上的存储库大小 I tried git count objects v 但它为每个分支提供相同的存储库大小 With Git 2 31 Q1 2021 git r