我最近遇到了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在我的远程仓库上运行此命令,还是有办法将此更改推送到存储库?
答案 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 --all
,git gc --prune=now
,git 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以下。