如何避免“ git gc”生成垃圾松散对象?

时间:2019-03-29 10:04:30

标签: git git-gc

在我运行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几乎不会运行(并且我不想更改它)。

1 个答案:

答案 0 :(得分:2)

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

您还可以配置gc.pruneExpire:如果未设置,则默认为2.weeks.ago,这就是上面的默认值。与j6t notes一样,它的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周默认值也不一定足够。