我最近遇到了 Bitbucket 存储库的大小限制。我遵循了无数其他问题来回答如何清理 git 存储库,最终使用 BFG 删除了一些错误的提交。
这非常有效,但是,我注意到运行 git count 后,垃圾中存在大量空间。所以我运行了一个简单的 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 在我的远程存储库上运行此命令,或者有没有办法将此更改推送到存储库?
我们认为今天遇到了同样的问题,并且能够解决它无需联系 Bitbucket 支持,如下所示。请注意,该方法会丢弃存储库中的最后一次提交 - 因此您可能需要其备份。
Bitbucket 报告称,我们的存储库约为 2.1GB,而克隆后,本地仅占用约 250MB。由此,我们得出的结论是,它很可能来自无法访问的提交中的大文件(感谢这个答案)。
这是在本地查看无法访问的提交的方法,我们不考虑通过引用日志的可达性:
git fsck --unreachable --no-reflog
在本地,无法访问的提交可以通过以下方式清除:
git reflog expire --expire-unreachable="now" --all
git prune --expire="now" -v
git gc --aggressive --prune="now"
但是,我们无法在 Bitbucket 上远程运行任何这些命令。但是,他们在关于减少存储库大小的页面(第删除存储库限制部分)上说,他们自己运行
git gc
以响应执行git reset --hard HEAD~1
(丢弃最后一次提交),然后执行git push -f
。另外,他们在“垃圾收集死数据”一节中说,可以尝试以下顺序:git reflog expire --expire=now --all
、git gc --prune=now
、git push --all --force
。鉴于这一切,我决定在本地尝试以下操作,希望它能删除引用日志并在本地进行修剪,然后将它们推送到远程 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 增加到约 2.1GB。 250MB。 :)
请注意,过期/过期无法访问/剪枝的时间参数设置从现在开始测量的过期截止点。所以例如“now”表示过期/修剪所有内容,“30m”表示除了过去 30 分钟内的更改之外。
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 以下。