如何避免 "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
(注意松散对象 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
在无法访问时从包中驱逐对象;它给了他们一个新的 "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 周的默认设置也不一定足够。
在我 运行 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
在无法访问时从包中驱逐对象;它给了他们一个新的 "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 周的默认设置也不一定足够。