1

在我跑之前git gc,我有几千个松散的物体:

$ git count-objects -v
count: 3706
size: 17164
in-pack: 147149
packs: 9
size-pack: 46619
prune-packable: 0
garbage: 0
size-garbage: 0

(注意松散的物体countsize)。在git gc我吃了更多之后:

$ git count-objects -v
count: 6735
size: 19687
in-pack: 142215
packs: 1
size-pack: 43373
prune-packable: 0
garbage: 0
size-garbage: 0

我知道发生这种情况是因为git gc当它们变得无法访问时从包中逐出对象;作为松散的物体,它给了他们新的“生命租约”。

我怎样才能避免这种单一的行为git gc发生?我希望它的所有其他行为保持不变,即所有超时、各种垃圾清除、除此之外的所有行为。

git gc最多每月跑一次。出于某种我不知道的原因,git gc --auto几乎没有运行过(我不想改变它)。

4

1 回答 1

2

如果您确定在该存储库上运行时没有其他 Git 命令在该存储库中运行git gc,则可以添加--prune=all. 默认值为--prune=2.weeks.ago,这使其他正在运行的命令有 14 天的时间来完成它们的工作;例如,您可以使用--prune=1.day.ago它来减少他们的时间。

您还可以配置gc.pruneExpire:如果未设置,则默认为2.weeks.ago产生上述默认值的内容。正如j6t 所指出的, this 的gc.pruneExpire设置变体是now而不是all. 但是在这里设置是不明智的now:自动git gc将使用此值在后台运行,而其他 Git 操作运行。

请注意,如果您的 Git 版本 >= 2.5 但低于 2.15.0,则减少的gc.pruneExpire可能会在比默认两周更短的时间内破坏您添加的工作树。该错误是git gc未能使用HEAD添加的工作树的和索引作为对象 DAG 的可达性遍历的起点。因此,git gc可以删除尚未提交的已添加 blob,并且,如果您有一个带有分离 HEAD 的工作树,甚至可以删除一些提交。最好的解决方法是升级到 2.15.0 或更高版本,因为即使是 2 周的默认设置也不一定足够。

于 2019-03-29T13:41:13.693 回答