在我运行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
几乎不会运行(并且我不想更改它)。
答案 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周默认值也不一定足够。