草庐IT

git - git gc/git repack 输出的 "Total"行中的数字是什么意思?

coder 2023-06-24 原文

当我跑 git gcgit repack在我的 Git 存储库中,一旦完成,它会输出一个“总计”行。这些数字是什么意思?

来自一个相当小的存储库的几个示例:

$ git gc
...
Total 576 (delta 315), reused 576 (delta 315)

$ git repack -afd --depth=250 --window=250
...
Total 576 (delta 334), reused 242 (delta 0)

还有一个来自更大的存储库:
$ git gc
...
Total 347629 (delta 289610), reused 342219 (delta 285060)
...

我可以猜到第一个“总数”是多少:存储库中 Git 对象(如提交、树和文件)的数量。所有其他人实际上是什么意思?

我已经看过 git-gc(1)git-repack(1)手册页,并仔细阅读了他们的“另请参阅”,我在谷歌上的尝试只产生了无关紧要的结果。

最佳答案

我做了一些工作 dulwich ,Git 的纯 Python 实现。我在这里要说的内容反射(reflect)了我在 dulwich 的 git 实现方面的经验,而不是规范的 git 源,因此可能存在差异。

Git 非常简单 - 我的意思是,简单到令人困惑!这个名字非常适合它的设计,由于它的愚蠢而非常聪明。

当您提交任何内容时,git 会获取索引(暂存区)中的内容并创建 SHA 摘要项,因此每个文件都会进行 SHA 处理,并且每个目录中的文件都会作为 blob 对象进行 SHA 处理,当然目录结构也会作为树对象进行 SHA 处理,并且所有这些都绑定(bind)到一个也有 SHA 的提交对象中。 Git 只是在处理提交时将这些直接发送到 .git/objects 中的文件系统。如果它成功地在那里触发所有这些,它只会将最近提交对象的 SHA 写入 .git/refs/heads/。

有时,提交可能会在中途失败。如果某些内容无法写入 .git/objects,则此时 git 不会进行清理。那是因为通常你会解决问题并重做提交——在这种情况下,git 将从它之前停止的地方重新启动,即提交的一半。

这就是 git gc 的用武之地。它只是解析 .git/objects 中的所有对象,标记出所有以某种方式被 HEAD 或 BRANCH 引用的对象。任何明显剩下的东西都是孤立的,与任何“重要”的东西都没有关系,因此可以将其删除。这就是为什么如果你分支,在那个分支上做一些工作,但后来放弃那个分支并从你的 git repo 中删除对它的任何引用,运行的定期 git gc 将完全清除你的分支。这可能会让一些老 VCS 用户感到惊讶,例如CVS 永远不会忘记任何事情,除非它崩溃或损坏自己(这经常发生)。

git repack(实际上是 git-pack-objects)与 git gc 完全不同(就像一个单独的命令和操作,尽管 git gc 可能会调用 git repack)。正如我之前提到的,git 只是将所有内容都发送到它自己的 SHAed 文件中。它会在进入磁盘存储之前对它们进行 gzip,但从长远来看,这显然不是空间效率。所以 git-pack-objects 所做的就是检查一系列 SHA 对象,用于数据跨修订复制的任何地方。它并不关心它是什么类型的 SHA 对象——所有这些对象都被认为是相同的打包对象。然后它生成有意义的二进制增量,并将整个批次作为 .pack 文件存储在 .git/objects/pack 中,从正常目录结构中删除任何打包的对象。

请注意,如果最新的包文件小于 1Mb,通常 git-pack-objects 会创建一个新的 .pack 文件而不是替换现有的 .pack 文件。因此,随着时间的推移,您会看到多个 .pack 文件出现在 .git/objects/pack 中。实际上,当您 git fetch 时,您只需要求远程存储库打包所有未打包的项目,并将获取存储库不需要的 .pack 文件发送到获取存储库。 git repack 只是调用 git-pack-objects 但告诉它 merge .pack 文件,因为它认为合适。这意味着解压缩任何已更改的内容,重新生成二进制增量并重新压缩。

因此,为了回答您的问题,总行是指 git 存储库中的对象总数。第一个 delta 数是那些作为二进制 delta 对象的总对象的数量,即 git 确定有多少对象与其他对象具有很强的相似性,并且可以存储为二进制 delta。重用的数字表示有多少来自压缩源(即包文件)的对象正在被使用而没有被重新压缩以包含最近的更改。当您有多个包文件但较新的 SHA 对象将旧包文件中的项目作为其基础,然后对其应用增量以使其现代时,就会发生这种情况。这让 git 可以使用以前压缩过的旧版本数据,而不必重新压缩它以包含最近添加的内容。请注意,git 可能会附加到现有的包文件,而无需重写整个包文件。

一般来说,高重用计数表示可以通过完全重新打包(即 git repack -a)回收一些空间,这将始终返回重用为零。但是,通常 git 会默默地为您处理所有这些。此外,执行完全重新打包可能会强制某些 git fetches 从头开始​​,因为包不同 - 这取决于服务器设置(允许自定义每个客户端包生成在服务器 CPU 上很昂贵,因此一些主要的 GIT 站点禁用它)。

希望这能回答你的问题。真的,对于 git 来说,它是如此简单,您会惊讶于它在开始时的工作原理,然后当您将头环绕在它周围时,您会留下深刻的印象。只有真正的天才程序员才能写出如此简单却又如此出色的东西,因为他们可以看到大多数程序员只能看到复杂性的简单性。

尼尔

关于git - git gc/git repack 输出的 "Total"行中的数字是什么意思?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9379714/

有关git - git gc/git repack 输出的 "Total"行中的数字是什么意思?的更多相关文章

  1. ruby - 如何从 ruby​​ 中的字符串运行任意对象方法? - 2

    总的来说,我对ruby​​还比较陌生,我正在为我正在创建的对象编写一些rspec测试用例。许多测试用例都非常基础,我只是想确保正确填充和返回值。我想知道是否有办法使用循环结构来执行此操作。不必为我要测试的每个方法都设置一个assertEquals。例如:describeitem,"TestingtheItem"doit"willhaveanullvaluetostart"doitem=Item.new#HereIcoulddotheitem.name.shouldbe_nil#thenIcoulddoitem.category.shouldbe_nilendend但我想要一些方法来使用

  2. ruby - 为什么我可以在 Ruby 中使用 Object#send 访问私有(private)/ protected 方法? - 2

    类classAprivatedeffooputs:fooendpublicdefbarputs:barendprivatedefzimputs:zimendprotecteddefdibputs:dibendendA的实例a=A.new测试a.foorescueputs:faila.barrescueputs:faila.zimrescueputs:faila.dibrescueputs:faila.gazrescueputs:fail测试输出failbarfailfailfail.发送测试[:foo,:bar,:zim,:dib,:gaz].each{|m|a.send(m)resc

  3. ruby - 其他文件中的 Rake 任务 - 2

    我试图在一个项目中使用rake,如果我把所有东西都放到Rakefile中,它会很大并且很难读取/找到东西,所以我试着将每个命名空间放在lib/rake中它自己的文件中,我添加了这个到我的rake文件的顶部:Dir['#{File.dirname(__FILE__)}/lib/rake/*.rake'].map{|f|requiref}它加载文件没问题,但没有任务。我现在只有一个.rake文件作为测试,名为“servers.rake”,它看起来像这样:namespace:serverdotask:testdoputs"test"endend所以当我运行rakeserver:testid时

  4. ruby-on-rails - Ruby net/ldap 模块中的内存泄漏 - 2

    作为我的Rails应用程序的一部分,我编写了一个小导入程序,它从我们的LDAP系统中吸取数据并将其塞入一个用户表中。不幸的是,与LDAP相关的代码在遍历我们的32K用户时泄漏了大量内存,我一直无法弄清楚如何解决这个问题。这个问题似乎在某种程度上与LDAP库有关,因为当我删除对LDAP内容的调用时,内存使用情况会很好地稳定下来。此外,不断增加的对象是Net::BER::BerIdentifiedString和Net::BER::BerIdentifiedArray,它们都是LDAP库的一部分。当我运行导入时,内存使用量最终达到超过1GB的峰值。如果问题存在,我需要找到一些方法来更正我的代

  5. ruby-on-rails - rails : "missing partial" when calling 'render' in RSpec test - 2

    我正在尝试测试是否存在表单。我是Rails新手。我的new.html.erb_spec.rb文件的内容是:require'spec_helper'describe"messages/new.html.erb"doit"shouldrendertheform"dorender'/messages/new.html.erb'reponse.shouldhave_form_putting_to(@message)with_submit_buttonendendView本身,new.html.erb,有代码:当我运行rspec时,它失败了:1)messages/new.html.erbshou

  6. ruby-on-rails - 由于 "wkhtmltopdf",PDFKIT 显然无法正常工作 - 2

    我在从html页面生成PDF时遇到问题。我正在使用PDFkit。在安装它的过程中,我注意到我需要wkhtmltopdf。所以我也安装了它。我做了PDFkit的文档所说的一切......现在我在尝试加载PDF时遇到了这个错误。这里是错误:commandfailed:"/usr/local/bin/wkhtmltopdf""--margin-right""0.75in""--page-size""Letter""--margin-top""0.75in""--margin-bottom""0.75in""--encoding""UTF-8""--margin-left""0.75in""-

  7. ruby-on-rails - Rails 3 中的多个路由文件 - 2

    Rails2.3可以选择随时使用RouteSet#add_configuration_file添加更多路由。是否可以在Rails3项目中做同样的事情? 最佳答案 在config/application.rb中:config.paths.config.routes在Rails3.2(也可能是Rails3.1)中,使用:config.paths["config/routes"] 关于ruby-on-rails-Rails3中的多个路由文件,我们在StackOverflow上找到一个类似的问题

  8. ruby-on-rails - Rails - 子类化模型的设计模式是什么? - 2

    我有一个模型:classItem项目有一个属性“商店”基于存储的值,我希望Item对象对特定方法具有不同的行为。Rails中是否有针对此的通用设计模式?如果方法中没有大的if-else语句,这是如何干净利落地完成的? 最佳答案 通常通过Single-TableInheritance. 关于ruby-on-rails-Rails-子类化模型的设计模式是什么?,我们在StackOverflow上找到一个类似的问题: https://stackoverflow.co

  9. ruby - 什么是填充的 Base64 编码字符串以及如何在 ruby​​ 中生成它们? - 2

    我正在使用的第三方API的文档状态:"[O]urAPIonlyacceptspaddedBase64encodedstrings."什么是“填充的Base64编码字符串”以及如何在Ruby中生成它们。下面的代码是我第一次尝试创建转换为Base64的JSON格式数据。xa=Base64.encode64(a.to_json) 最佳答案 他们说的padding其实就是Base64本身的一部分。它是末尾的“=”和“==”。Base64将3个字节的数据包编码为4个编码字符。所以如果你的输入数据有长度n和n%3=1=>"=="末尾用于填充n%

  10. ruby - 解析 RDFa、微数据等的最佳方式是什么,使用统一的模式/词汇(例如 schema.org)存储和显示信息 - 2

    我主要使用Ruby来执行此操作,但到目前为止我的攻击计划如下:使用gemsrdf、rdf-rdfa和rdf-microdata或mida来解析给定任何URI的数据。我认为最好映射到像schema.org这样的统一模式,例如使用这个yaml文件,它试图描述数据词汇表和opengraph到schema.org之间的转换:#SchemaXtoschema.orgconversion#data-vocabularyDV:name:namestreet-address:streetAddressregion:addressRegionlocality:addressLocalityphoto:i

随机推荐