git-sizer

git-sizer

Git存储库大小分析与优化工具

git-sizer是一款专门分析Git存储库大小的开源工具。它可计算本地Git仓库的多种大小指标,并标记潜在问题。该工具提供仓库总体大小、对象数量、最大对象等关键数据,有助于开发者优化仓库结构,提升Git操作效率。git-sizer适用于大型项目和团队协作,是实用的Git仓库管理辅助工具。

git-sizerGit仓库性能分析代码管理存储优化Github开源项目

"幸福的Git仓库都是相似的;不幸的Git仓库各有各的不幸。" —莱纳斯·托尔斯泰

git-sizer

你的Git仓库是否已经快要撑破了?

git-sizer计算本地Git仓库的各种大小指标,并标记那些可能会给你带来问题或不便的指标。例如:

  • 仓库整体是否太大?理想情况下,Git仓库应该小于1 GiB,如果超过5 GiB(没有特殊处理)就会变得难以管理。大型仓库需要很长时间来克隆和重新打包,并且占用大量磁盘空间。建议:

    • 避免在Git中存储生成的文件(如编译器输出、JAR文件)。最好在需要时重新生成它们,或将它们存储在包注册表甚至文件服务器中。

    • 避免在Git中存储大型媒体资产。你可以考虑使用Git-LFSgit-annex,它们允许你在Git中对媒体资产进行版本控制,同时将它们实际存储在仓库之外。

    • 避免在Git中存储文件归档(如ZIP文件、tar包),尤其是压缩过的。这类文件的不同版本之间很难进行增量存储,所以Git无法高效地存储它们。最好将单个文件存储在你的仓库中,或将归档文件存储在其他地方。

  • 仓库是否有太多引用(分支和/或标签)?每次获取时,所有这些都必须传输到客户端,即使你的克隆是最新的。尽量将它们限制在最多几万个。建议:

    • 删除不需要的标签和分支。

    • 避免将你的"远程跟踪"分支推送到共享仓库。

    • 考虑使用"git notes"而不是标签来为提交附加辅助信息(例如,CI构建结果)。

    • 也许可以将一些很少需要的标签和分支存储在仓库的单独分支中,普通开发人员不会从中获取。

  • 仓库是否包含太多对象?对象越多,Git遍历仓库历史所需的时间就越长,例如在进行垃圾回收时。建议:

    • 考虑是否存储了大量可以轻松合并成几个大文件的小文件。

    • 考虑将你的项目拆分成多个子项目。

  • 仓库是否包含巨大的blob(文件)?Git最适合处理中小型文件。有几个兆字节范围的文件是可以的,但它们通常应该是例外。建议:

    • 考虑使用Git-LFS来存储大文件,特别是那些不便于差异比较和合并的文件(如媒体资产)。

    • 另请参阅"仓库整体是否太大?"一节。

  • 仓库是否包含许多版本的大型文本文件,每个版本与前一个版本略有不同?这些文件可以很好地进行增量存储,所以它们可能不会导致你的仓库急剧增长。但对Git来说,重建完整文件并对它们进行差异比较的成本很高,而这是许多操作内部需要做的。建议:

    • 避免在Git中存储日志文件和数据库转储。

    • 避免在Git中存储巨大的数据文件(如巨大的XML文件),特别是如果它们经常被修改。考虑使用数据库代替。

  • 仓库是否包含巨大的树(目录)?每次修改文件时,Git都必须为通向该文件的每个树(即路径中的每个目录)创建一个新副本。巨大的树会使这个过程变得昂贵。此外,遍历包含巨大树的历史记录非常耗时,例如在进行git blame时。建议:

    • 避免创建包含超过几千个条目的目录。

    • 如果必须存储非常多的文件,最好将它们分散到多个较小目录的层次结构中。

  • 仓库是否在单个提交中的不同路径下重复存储相同(或非常相似)的文件?如果是这样,仓库可能有一个合理的总体大小,但当你检出时,它会膨胀成一个巨大的工作副本。(极端情况下,这被称为"git炸弹";见下文。)建议:

    • 也许你可以通过使用标签和分支或构建时配置系统来更有效地实现你的目标。
  • 仓库是否包含荒谬的长路径名?这可能无法很好地与其他工具配合使用。即使你在写Java,一两百个字符应该足够了。

  • 仓库中是否还有其他奇怪和可疑的东西?

    • 互相指向的注释标签形成长链?

    • 有数十个父提交的章鱼合并?

    • 具有巨大日志消息的提交?

git-sizer计算你的仓库的许多与大小相关的统计数据,可以帮助揭示上述所有问题。这些做法本身并不是错误的,但是你越是将Git推离其最佳使用范围,就越难以享受Git传奇般的速度和性能。特别是如果你的Git仓库统计数据似乎与你的项目规模不成比例,你也许可以通过调整Git的使用方式来使你的工作更轻松。

入门

  1. 确保你已安装Git命令行客户端版本 >= 2.6。注意:git-sizer调用git命令来检查你的仓库内容,所以运行git-sizer时必须将git命令放在你的PATH

  2. 安装git-sizer。可以选择以下方式之一:

    a. 安装git-sizer的发布版本(推荐): 1. 前往发布页面并下载对应你平台的ZIP文件。 2. 解压文件。 3. 将可执行文件(git-sizergit-sizer.exe)移动到你的PATH中。

    b. 从源代码构建和安装。参见docs/BUILDING.md中的说明。

  3. 切换到包含你想分析的Git仓库的完整非浅克隆的目录。然后运行

     git-sizer [<选项>...]
    

    不需要任何选项。你可以通过输入git-sizer -h或继续阅读来了解可用的选项。

专业提示:如果你将git-sizer添加到你的PATH中,那么你可以通过输入git-sizergit sizer来运行它。在后一种情况下,它会被Git找到并运行,你可以在两个单词之间添加额外的Git选项,比如git -C /path/to/my/repo sizer。如果你没有将git-sizer添加到你的PATH中,那么你当然需要输入它的完整路径和文件名来运行它;例如,/path/to/bin/git-sizer。无论哪种情况,git可执行文件必须在你的PATH中。

使用方法

默认情况下,git-sizer以表格格式输出其结果。例如,让我们用它来分析Linux仓库,使用--verbose选项以输出所有统计信息:

$ git-sizer --verbose
处理 blob:1652370
处理树:3396199
处理提交:722647
匹配提交到树:722647
处理带注释的标签:534
处理引用:539
| 名称                         | 值        | 关注程度                       |
| ---------------------------- | --------- | ------------------------------ |
| 整体仓库大小                 |           |                                |
| * 提交                       |           |                                |
|   * 数量                     |   723 k   | *                              |
|   * 总大小                   |   525 MiB | **                             |
| * 树                         |           |                                |
|   * 数量                     |  3.40 M   | **                             |
|   * 总大小                   |  9.00 GiB | ****                           |
|   * 总树条目                 |   264 M   | *****                          |
| * Blob                       |           |                                |
|   * 数量                     |  1.65 M   | *                              |
|   * 总大小                   |  55.8 GiB | *****                          |
| * 带注释的标签               |           |                                |
|   * 数量                     |   534     |                                |
| * 引用                       |           |                                |
|   * 数量                     |   539     |                                |
|                              |           |                                |
| 最大对象                     |           |                                |
| * 提交                       |           |                                |
|   * 最大大小             [1] |  72.7 KiB | *                              |
|   * 最多父提交           [2] |    66     | ******                         |
| * 树                         |           |                                |
|   * 最大条目             [3] |  1.68 k   | *                              |
| * Blob                       |           |                                |
|   * 最大大小             [4] |  13.5 MiB | *                              |
|                              |           |                                |
| 历史结构                     |           |                                |
| * 最大历史深度               |   136 k   |                                |
| * 最大标签深度           [5] |     1     |                                |
|                              |           |                                |
| 最大检出                     |           |                                |
| * 目录数量               [6] |  4.38 k   | **                             |
| * 最大路径深度           [7] |    13     | *                              |
| * 最大路径长度           [8] |   134 B   | *                              |
| * 文件数量               [9] |  62.3 k   | *                              |
| * 文件总大小             [9] |   747 MiB |                                |
| * 符号链接数量          [10] |    40     |                                |
| * 子模块数量                 |     0     |                                |

[1]  91cc53b0c78596a73fa708cceb7313e7168bb146
[2]  2cde51fbd0f310c8a2c5f977e665c0ac3945b46d
[3]  4f86eed5893207aca2c2da86b35b38f2e1ec1fc8 (refs/heads/master:arch/arm/boot/dts)
[4]  a02b6794337286bc12c907c33d5d75537c240bd0 (refs/heads/master:drivers/gpu/drm/amd/include/asic_reg/vega10/NBIO/nbio_6_1_sh_mask.h)
[5]  5dc01c595e6c6ec9ccda4f6f69c131c0dd945f8c (refs/tags/v2.6.11)
[6]  1459754b9d9acc2ffac8525bed6691e15913c6e2 (589b754df3f37ca0a1f96fccde7f91c59266f38a^{tree})
[7]  78a269635e76ed927e17d7883f2d90313570fdbc (dae09011115133666e47c35673c0564b0a702db7^{tree})
[8]  ce5f2e31d3bdc1186041fdfd27a5ac96e728f2c5 (refs/heads/master^{tree})
[9]  532bdadc08402b7a72a4b45a2e02e5c710b7d626 (e9ef1fe312b533592e39cddc1327463c30b0ed8d^{tree})
[10] f29a5ea76884ac37e1197bef1941f62fda3f7b99 (f5308d1b83eba20e69df5e0926ba7257c8dd9074^{tree})

输出是一个表格,显示了被测量的项目、其数值和可能引起关注的值的粗略指示。在所有情况下,只包括从引用可达的对象(即,不包括不可达对象,也不包括仅从 reflogs 可达的对象)。

"整体仓库大小"部分包括关于不同对象的仓库范围统计,不包括重复。"总大小"是相应对象未压缩形式的大小总和,以字节为单位。所有对象的总未压缩大小是一个很好的指标,表明像 git gc --aggressive(以及 git repack [-f|-F]git pack-objects --no-reuse-delta)、git fsckgit log [-G|-S] 这样的命令会有多昂贵。树和提交的未压缩大小是可达性遍历(包括克隆、获取和 git gc)代价的良好指标。

"最大对象"部分提供了历史中每种类型的最大单个对象的信息。

在"历史结构"部分,"最大历史深度"是历史中最长的提交链,"最大标签深度"报告指向其他带注释标签的带注释标签的最长链。

"最大检出"部分是关于提交检出到工作副本的大小。"最大路径深度"是工作副本中文件的最大路径组件数,"最大路径长度"是以字节计的最长路径。"文件总大小"是单个最大提交中所有文件大小的总和,如果同一文件出现多次,则包括重复计数。

"值"列显示计数,使用单位"k"(千)、"M"(百万)、"G"(十亿)等,以及大小,使用单位"B"(字节)、"KiB"(1024字节)、"MiB"(1024 KiB)等。注意,如果一个值溢出其计数器(这应该只发生在恶意仓库中),相应的值在表格形式中显示为 ,或在 JSON 模式下截断为 2³²-1 或 2⁶⁴-1(取决于计数器的大小)。 "关注级别"列使用星号来标示与"典型"Git仓库相比似乎较高的值。星号越多,表示您的仓库的这一方面可能会造成更多不便。感叹号表示极高的值(相当于超过30个星号)。

脚注列出了表格中引用的"最大"对象的SHA-1值,以及更易读的<提交>:<路径>格式,描述了该对象在仓库历史中的位置。给定一个大对象的名称,您可以在命令行中输入:

git cat-file -p <提交>:<路径>

来查看该对象的内容。(使用--names=none可以省略这些脚注。)

默认情况下,只报告高于最低关注级别的统计信息。使用--verbose(如上所示)可以请求输出所有统计信息。使用--threshold=<值>可以抑制报告低于指定关注级别的统计信息。(<值>被解释为与星号数量对应的数值。)使用--critical只报告关注级别达到临界值的统计信息(相当于--threshold=30)。

如果您想要机器可读格式的输出,包括精确数字,请使用--json选项。您可以使用--json-version=1或--json-version=2来选择旧式或新式JSON输出。

要获取其他选项的列表,请运行:

git-sizer -h

Linux仓库按大多数标准来说都很大。如您所见,它正在挑战Git的一些极限。确实,对Linux仓库进行某些Git操作(如git fsck、git gc)确实需要一些时间。但由于其结构合理,没有任何维度与代码库的大小严重不成比例,因此内核项目成功地使用Git进行管理。

以下是一个著名的"git炸弹"仓库的非详细输出:

$ git-sizer
[...]
| 名称                         | 值         | 关注级别                       |
| ---------------------------- | ---------- | ------------------------------ |
| 最大检出                     |            |                                |
| * 目录数量               [1] |  1.11 G    | !!!!!!!!!!!!!!!!!!!!!!!!!!!!!! |
| * 最大路径深度           [1] |    11      | *                              |
| * 文件数量               [1] |     ∞      | !!!!!!!!!!!!!!!!!!!!!!!!!!!!!! |
| * 文件总大小             [2] |  83.8 GiB  | !!!!!!!!!!!!!!!!!!!!!!!!!!!!!! |

[1]  c1971b07ce6888558e2178a121804774c4201b17 (refs/heads/master^{tree})
[2]  d9513477b01825130c48c4bebed114c4b2d50401 (18ed56cbc5012117e24a603e7c072cf65d36d469^{tree})

这个仓库被恶意构造成具有病态的树结构,相同的目录重复出现。因此,尽管整个仓库的大小不到20 kb,但检出时会膨胀成超过10亿个目录,包含超过100亿个文件。(git-sizer为blob计数打印∞,因为真实数字已经溢出了用于该字段的32位计数器。)

贡献

git-sizer正在经常使用并仍在积极开发中。如果您想提供帮助,请参阅CONTRIBUTING.md。

编辑推荐精选

TRAE编程

TRAE编程

AI辅助编程,代码自动修复

Trae是一种自适应的集成开发环境(IDE),通过自动化和多元协作改变开发流程。利用Trae,团队能够更快速、精确地编写和部署代码,从而提高编程效率和项目交付速度。Trae具备上下文感知和代码自动完成功能,是提升开发效率的理想工具。

热门AI工具生产力协作转型TraeAI IDE
蛙蛙写作

蛙蛙写作

AI小说写作助手,一站式润色、改写、扩写

蛙蛙写作—国内先进的AI写作平台,涵盖小说、学术、社交媒体等多场景。提供续写、改写、润色等功能,助力创作者高效优化写作流程。界面简洁,功能全面,适合各类写作者提升内容品质和工作效率。

AI助手AI工具AI写作工具AI辅助写作蛙蛙写作学术助手办公助手营销助手
问小白

问小白

全能AI智能助手,随时解答生活与工作的多样问题

问小白,由元石科技研发的AI智能助手,快速准确地解答各种生活和工作问题,包括但不限于搜索、规划和社交互动,帮助用户在日常生活中提高效率,轻松管理个人事务。

聊天机器人AI助手热门AI工具AI对话
Transly

Transly

实时语音翻译/同声传译工具

Transly是一个多场景的AI大语言模型驱动的同声传译、专业翻译助手,它拥有超精准的音频识别翻译能力,几乎零延迟的使用体验和支持多国语言可以让你带它走遍全球,无论你是留学生、商务人士、韩剧美剧爱好者,还是出国游玩、多国会议、跨国追星等等,都可以满足你所有需要同传的场景需求,线上线下通用,扫除语言障碍,让全世界的语言交流不再有国界。

讯飞智文

讯飞智文

一键生成PPT和Word,让学习生活更轻松

讯飞智文是一个利用 AI 技术的项目,能够帮助用户生成 PPT 以及各类文档。无论是商业领域的市场分析报告、年度目标制定,还是学生群体的职业生涯规划、实习避坑指南,亦或是活动策划、旅游攻略等内容,它都能提供支持,帮助用户精准表达,轻松呈现各种信息。

热门AI工具AI办公办公工具讯飞智文AI在线生成PPTAI撰写助手多语种文档生成AI自动配图
讯飞星火

讯飞星火

深度推理能力全新升级,全面对标OpenAI o1

科大讯飞的星火大模型,支持语言理解、知识问答和文本创作等多功能,适用于多种文件和业务场景,提升办公和日常生活的效率。讯飞星火是一个提供丰富智能服务的平台,涵盖科技资讯、图像创作、写作辅助、编程解答、科研文献解读等功能,能为不同需求的用户提供便捷高效的帮助,助力用户轻松获取信息、解决问题,满足多样化使用场景。

模型训练热门AI工具内容创作智能问答AI开发讯飞星火大模型多语种支持智慧生活
Spark-TTS

Spark-TTS

一种基于大语言模型的高效单流解耦语音令牌文本到语音合成模型

Spark-TTS 是一个基于 PyTorch 的开源文本到语音合成项目,由多个知名机构联合参与。该项目提供了高效的 LLM(大语言模型)驱动的语音合成方案,支持语音克隆和语音创建功能,可通过命令行界面(CLI)和 Web UI 两种方式使用。用户可以根据需求调整语音的性别、音高、速度等参数,生成高质量的语音。该项目适用于多种场景,如有声读物制作、智能语音助手开发等。

咔片PPT

咔片PPT

AI助力,做PPT更简单!

咔片是一款轻量化在线演示设计工具,借助 AI 技术,实现从内容生成到智能设计的一站式 PPT 制作服务。支持多种文档格式导入生成 PPT,提供海量模板、智能美化、素材替换等功能,适用于销售、教师、学生等各类人群,能高效制作出高品质 PPT,满足不同场景演示需求。

讯飞绘文

讯飞绘文

选题、配图、成文,一站式创作,让内容运营更高效

讯飞绘文,一个AI集成平台,支持写作、选题、配图、排版和发布。高效生成适用于各类媒体的定制内容,加速品牌传播,提升内容营销效果。

AI助手热门AI工具AI创作AI辅助写作讯飞绘文内容运营个性化文章多平台分发
材料星

材料星

专业的AI公文写作平台,公文写作神器

AI 材料星,专业的 AI 公文写作辅助平台,为体制内工作人员提供高效的公文写作解决方案。拥有海量公文文库、9 大核心 AI 功能,支持 30 + 文稿类型生成,助力快速完成领导讲话、工作总结、述职报告等材料,提升办公效率,是体制打工人的得力写作神器。

下拉加载更多