git垃圾大小失控,需要了解

时间:2015-06-23 10:09:46

标签: git garbage-collection dvcs unreal-engine4

我们正在使用git作为我们的DVCS,用于一个非常大的项目(是的,我知道git它并不总是指向最适合这些情况),并且我不会做的事情是'我完全理解我的回购。

这是我的计数对象输出:

count: 53
size: 1.57 MiB
in-pack: 26444
packs: 2
size-pack: 42.49 GiB
prune-packable: 0
garbage: 8
size-garbage: 32.22 GiB

你可以看到大小小于2Mb,大小包是43Gb(这究竟是什么?),但是大小垃圾是32Gb!那是什么?我可以删除它吗?怎么样?

我尝试了许多在互联网上找到的选项,他们对在单独的存储库中做什么的理解很差,基本上没有收益或重大变化。像:

git reflog expire --all --expire=now
git gc --prune=now --aggressive
git gc
git repack -a -d --depth=250 --window=250

1 个答案:

答案 0 :(得分:2)

git reflog expire --all --expire=now

您通常不希望将其用作最终用户,但如果您引入了大量数据,最终将其拉出分支(如重置为先前的提交,并生成没有数据的新提交)。在这种情况下,你仍然有一个对reflog中数据的活动引用,git会保留对象,直到它们过期。

git gc --prune=now --aggressive

避免使用--aggressive选项。根据我的经验,这对于太少的收益确实太过分了。但是,变体git gc --prune=now 可能是你想要的。这将删除任何未引用的数据。一般来说,Git会将未引用的数据保留几周,但这可以很快加起来。此外,它将重新打包存储库,与松散的对象相比可以节省相当多的空间(松散的对象不会被压缩)。

git gc

这种形式的git gc也很有用。它仍将修剪,但使用默认时间范围。任何比默认值更年轻的东西都会留作一个松散的对象,所以如果你打算改善磁盘空间,我不会推荐这个表格。

git repack -a -d --depth=250 --window=250

这个已经出现了一段时间,但一般都是错误的应用。如果您从另一个版本控制系统转换了您的存储库,并且转换过程没有选择好父母进行打包,这只会非常有用。它的计算成本也很高,需要很长时间才能完成。在使用差的delta选项转换的存储库中,它可以产生巨大的差异。但这不太可能是你想要的。

count: 53
size: 1.57 MiB
in-pack: 26444
packs: 2
size-pack: 42.49 GiB
prune-packable: 0
garbage: 8
size-garbage: 32.22 GiB
  

你可以看到大小小于2Mb,大小包是43Gb(这究竟是什么?),但是大小垃圾是32Gb!那是什么?我可以删除它吗?怎么样?

size指的是当前引用的磁盘上的松散对象。这可能是通过reflog,分支,遥控器等。size-garbage字段是有趣的。这是当前未引用的数据,可用于垃圾回收。 git gc会立即删除它,只要它超过2周。 git gc --prune=now尽管已经过了年龄,但会删除它。

因此,最后,您可能希望在存储库中运行git gc --prune=now