如何清理远程git仓库中的垃圾

时间:2015-01-09 19:28:10

标签: git bitbucket

我最近遇到了Bitbucket repo的大小限制。我跟着无数其他问题回答了如何清理你的git repo并最终使用BFG删除了一些糟糕的提交。

这很好用但是,我注意到在运行git计数后,垃圾中有大量的空间。所以我运行了一个简单的git gc。然而,这没有什么可以清理垃圾。

经过一番挖掘后,我找到了以下命令:

git -c gc.reflogExpire=0 -c gc.reflogExpireUnreachable=0 -c gc.rerereresolved=0 \
-c gc.rerereunresolved=0 -c gc.pruneExpire=now gc "$@"

运行此操作导致垃圾被清理 本地 。但是,我仍然有远程回购的问题。我现在需要让Bitbucket在我的远程仓库上运行此命令,还是有办法将此更改推送到存储库?

2 个答案:

答案 0 :(得分:25)

我们认为我们今天遇到了同样的问题并且能够解决它而不联系Bitbucket支持,如下所示。请注意,该方法会丢弃来自repo的最后一次提交 - 因此您可能希望进行备份。

据Bitbucket报道,我们的回购大约是2.1GB,而克隆时,它本地只需要大约250MB。由此,我们得出结论,它最有可能来自无法访问的大文件(感谢this answer)。

这是如何在本地查看无法访问的提交,我们没有考虑通过reflog的可达性:

git fsck --unreachable --no-reflog

在本地,无法访问的提交可以使用以下方式清除:

git reflog expire --expire-unreachable="now" --all
git prune --expire="now" -v
git gc --aggressive --prune="now"

然而,我们无法在Bitbucket上远程运行任何这些命令。但是,他们在the page about reducing repo size(部分删除存储库限制)上说,他们自己运行git gc以响应git reset --hard HEAD~1丢弃最后一次提交)后跟git push -f。此外,他们在垃圾收集死数据一节中说,可以尝试序列:git reflog expire --expire=now --allgit gc --prune=nowgit push --all --force。鉴于这一切,我决定在本地尝试以下内容,希望它能删除reflog并在本地进行修剪,然后将它们推送到远程Bitbucket存储库,然后启动gc:

git reflog expire --expire-unreachable="30m" --all
git prune --expire="30m" -v
git gc --prune="30m"
git reset --hard HEAD~1
git push -f

这很有效,回购大小立即从2.1GB变为大约。 250MB。 :)

请注意,到期/ expire-unreachable / prune的时间参数设置从现在开始测量的到期截止点。所以例如“now”表示过期/修剪所有内容,“30m”表示除最近30分钟内的更改外。

答案 1 :(得分:7)

如果其他人遇到这种情况,答案结果是肯定的。

Bitbucket支持如下:

git reflog expire --expire="1 hour" --all
git reflog expire --expire-unreachable="1 hour" --all
git prune --expire="1 hour" -v
git gc --aggressive --prune="1 hour"

之前和之后将远程仓库大小从2GB以上减少到1GB以下。