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

How to avoid that "git gc" generates garbage loose objects?

在我 运行 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 在无法访问时从包中驱逐对象;它给了他们一个新的 "lease of life" 作为松散的对象。

如何避免 git gc 的这种单一行为发生?我希望它的所有其他行为都保留下来,即所有超时、各种垃圾清除,除了这个以外的所有行为。

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

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

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