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

How to cleanup garbage in remote git repo

我最近 运行 我的 Bitbucket 存储库遇到了大小限制。我遵循了无数其他回答如何清理 git 存储库的问题,并最终使用 BFG 删除了一些错误的提交。

效果很好,但是,我注意到在 运行 计算 git 之后,有大量 space 处于垃圾状态。所以我运行一个简单的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 支持运行以下内容:

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

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

Bitbucket 报告说我们的 repo 大约是 2.1GB,而克隆时,它在本地只占用了大约 250MB。由此,我们得出结论,它很可能来自无法访问的提交中的大文件(感谢 )。

这是在本地查看无法访问的提交的方法,我们不考虑通过 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 并在本地执行 p运行e,然后将它们推送到远程 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

这成功了,repo 大小立即从 2.1GB 变成了 ca。 250MB。 :)

请注意,时间参数到期/到期无法访问/p运行e 设置从现在开始测量的到期截止点。所以例如"now" 表示过期/p运行e 一切,“30m”表示除了最近 30 分钟内的变化。