在我运行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
(注意松散的对象count
和size
)。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 周的默认值也不一定足够。