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

问题描述 投票:0回答:3

我最近遇到了 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 在我的远程存储库上运行此命令,或者有没有办法将此更改推送到存储库?

git bitbucket
3个回答
59
投票

我们认为今天遇到了同样的问题,并且能够解决它无需联系 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 分钟内的更改之外。


11
投票

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 以下。 


0
投票

我发现了一篇 Bitbucket 帖子,详细介绍了如何触发自动垃圾收集,发布于 2022 年 11 月:

https://bitbucket.org/blog/updated-repository-limits-and-automatic-garbage-collection

本质上,这篇文章确认了执行

git reset --hard HEAD~1

后执行

git push --force
现在会自动触发完整的垃圾回收,如前面所讨论的。
    

© www.soinside.com 2019 - 2024. All rights reserved.