了解git的GC --auto(Understanding git gc --auto)

2019-09-01 18:00发布

我有相当积极的自动GC尝试在Git中,主要用于包装用途。 在我的回购协议,如果我做git config --list我已经安装

...
gc.auto=250
gc.autopacklimit=30
...

如果我做git count-objects -v我得到

count: 376
size: 1251
in-pack: 2776
packs: 1
size-pack: 2697
prune-packable: 0
garbage: 0

但是git gc --auto不改变这些数字,没有什么是被包装! 不应松动物体得到挤满因为我是126级的对象在gc.auto限制?

Answer 1:

其中一个要点gc --auto是,它应该是非常快的,所以其他命令可以经常称之为“以防万一”。 为了实现这个目标,对象计数只是猜测。 由于git help config下称gc.auto

当有超过这么多松散物大约多在库[...]

看代码( too_many_loose_objects()buildin/gc.c ),这里是发生了什么:

  1. 该gc.auto由256分和围捕
  2. 包含有开头的所有对象的文件夹17被打开
  3. 如果文件夹包含比第1步的结果,更多的对象检查

这工作得很好,因为SHA-1是均匀分布的,所以“与X开头的所有对象”是整套的代表。 但是,当然,这仅适用于对象的一个​​大大的量。 懒做数学,我猜至少> 3000。 随着6700(默认值gc.auto ),这应该已经工作得非常可靠。

对我来说,核心问题就是为什么你需要这么低的设置,是否是很重要的,这确实运行在250级的对象。 随着250的设置, gc会只要你有这样开始的2名宽松的对象上运行17 。 出现这种情况的机会是> 80% 600个目的和> 90%为800级的对象。

更新:无法帮助它-不得不做数学:)。 我想知道的是评估系统将如何工作。 下面是结果的曲线图。 对于任何给定gc.auto ,有多高的概率gc时,有将开始gc.auto (红色)/ gc.auto * 1.1 (绿色)/ gc.auto * 1.2 (橙色)/ gc.auto * 1.5 (蓝色)/ gc.auto * 2在回购(紫色)松散物?



Answer 2:

需要注意的是gc auto是在Git的2.12.2更稳健(2017年3月发布的前两天)。

见提交a831c06 (2017年2月10日),由大卫·特纳( csusbdt ) 。
帮助-由: 杰夫·金( peff ) 。
(通过合并JUNIOÇ滨野- gitster -在提交d30ec1b 3月21日2017)

gc :忽略老gc.log文件

一台服务器可以在有大量未引用的散装物品(比如说,因为很多用户在做一堆垫底的,推动它们的底垫分支机构)的状态结束。
运行“ git gc --auto在这种状态下”将导致gc.log要创建的文件,防止未来的汽车GCS,导致包文件堆积。
由于许多git的操作是O(n)在包文件的数量,这将导致性能不佳。

Git的不应该让自己进入它拒绝做任何维修,因为在某些时候某些片的保养没有取得进展,只是一种状态。

教的Git忽略gc.log这比(默认)一日龄,可通过进行调整旧文件gc.logExpiry配置变量
这样一来,这些包文件将得到清理,如果必要的话,每天至少一次。 和谁找到需要更频繁的GCS运营商可以调整gc.logExpiry ,以满足他们的需求。


注:由于Git的2.17(Q2 2018), git gc --auto将在每次运行git commit了。
请参阅“ 引起的所有命令的列表git gc --auto ”。

而且还有一个pre-gc --auto关联到该命令也钩 。



文章来源: Understanding git gc --auto