如何避免"git gc"产生垃圾松散对象?

  • 本文关键字:对象 何避免 git gc 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几乎从不运行(我不想改变这一点)。

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

您还可以配置gc.pruneExpire:如果未设置,则默认为2.weeks.ago这是产生上述默认值的原因。 正如 j6t 所指出的,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 周的默认值也不一定足够。

相关内容

  • 没有找到相关文章

最新更新