当我在Git存储库上运行git gc或git repack时,一旦完成,它就会输出一个“总计”行。这些数字是什么意思?
在一个相当小的存储库中,有几个示例:
$ 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)的手册页面,并仔细阅读了他们的“也见”,而我在谷歌搜索的尝试只产生了不相关的结果。
发布于 2012-02-27 14:42:45
我使用杜尔维奇做了一些工作,它是Git的纯python实现。我在这里要说的是我在dulwich的git实现方面的经验,而不是规范的git源代码,因此可能会有不同之处。
Git是非常简单的-我是说,如此简单,它混淆了!这个名字非常适合它的设计,这是非常聪明的,因为它的愚蠢。
当提交任何内容时,git获取索引(暂存区域)中的内容,并创建SHA摘要项,因此每个文件都获得SHAed,而每个目录中的文件将SHAed作为blob对象,当然目录结构将SHAed作为树对象,所有绑定到也具有SHA的提交对象中的所有内容。Git只是在.git/objects中处理提交时直接将其激发到归档系统中。如果它成功地触发了其中的所有对象,它只需将最近提交对象的SHA写入..git/refs/head/。
有时,一次提交可能会在中途失败。如果有什么东西不能写入. git /对象,那么git在那个时候就不会进行清理。这是因为通常您将修复问题并重新执行提交--在本例中,git将从以前停止的位置重新启动,即在提交过程的一半时间内重新启动。
这是git gc进来的地方。它只是在. .git/objects中解析所有对象,标记出头部或分支以某种方式引用的所有对象。任何剩下的显然是孤儿,与任何“重要”无关,所以可以删除。这就是为什么如果您的分支,做一些工作,但在该分支,但后来放弃该分支,并删除对它的任何引用从您的git回购,周期性的git gc运行将完全清除您的分支。这可能会让一些较老的VCS用户感到惊讶,例如CVS除了崩溃或损坏自己(这是经常发生的)外,从未忘记任何东西。
git (实际上是git对象)与git完全不同(例如,一个单独的命令和操作,尽管git可以调用git)。正如我前面提到的,git只是将所有内容都激发到自己的SHAed文件中。在进入磁盘存储之前,它确实会对它们进行gzip,但是从长远来看,这显然是不节省空间的。所以git对象所做的就是检查一系列SHA对象,这些对象在数据跨版本复制的任何地方。它不关心它是什么类型的SHA对象--所有这些都被认为是相同的包装。然后,它生成二进制三角形,并将整批数据存储在..git/ .pack /pack中,将所有打包的对象从正常目录结构中删除。
注意,通常git对象生成一个新的.pack文件,而不是替换现有的.pack文件,如果最近的pack文件的大小小于1Mb。因此,随着时间的推移,您将看到多个.pack文件出现在. .git/objects/pack中。实际上,在git获取时,只需让远程回购打包所有未打包的项目,并将抓取回购不需要的.pack文件发送到获取回购。git只调用git对象,但告诉它根据需要合并.pack文件。这意味着对任何已经改变的事物进行解压缩,重新生成二进制三角洲并重新压缩。
因此,要回答您的问题,总行是指git中对象的总数。第一个增量数是二进制增量对象的总对象数,即git确定有多少对象与其他对象具有很强的相似性,并且可以作为二进制增量存储。重复使用的编号表示有多少来自压缩源(即包文件)的对象正在被使用,而没有被重新压缩以包含更多的最新更改。如果您有多个包文件,但是最近的SHA对象引用旧包文件中的一个项作为它的基础,那么就会发生这种情况,然后将增量应用到它以使其现代化。这使得git可以利用以前压缩过的旧版本的数据,而不必重新压缩它以包含更多的新内容。请注意,git可以附加到现有的包文件中,而无需重写整个包文件。
一般来说,高重用计数意味着可以用一个完整的repack (即git -a)来回收一些空间,而这个空间总是会返回到零。然而,通常git会默默地为您处理这一切。此外,执行完整的打包可能会迫使一些git获取从头开始,因为包不同这取决于服务器设置(允许在服务器CPU上自定义每个客户端包生成成本很高,因此一些主要的GIT站点禁用它)。
希望这能回答你的问题。真的,git是如此简单,你很惊讶它在一开始就起作用了,然后当你把头绕在它周围的时候,你会被深深地打动。只有真正天才的程序员才能写出这么简单的东西,但效果却很好,因为他们可以看到简单,而大多数程序员只能看到复杂性。
尼尔
https://stackoverflow.com/questions/9379714
复制相似问题