如何清理远程 Git 仓库中的垃圾文件

40

我最近在Bitbucket repo上遇到了大小限制问题。我按照无数其他解答清理git repo的问题并最终使用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在我的远程存储库上运行此命令,还是有一种将此更改推送到存储库的方法?


4
我无法代表Bitbucket,但通常情况下,裸克隆不会保留reflog;也不会有任何rerere数据。通常你只需要更新远程引用并在那里触发gc即可。 - torek
2个回答

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 reset --hard HEAD~1(将丢弃最后一次提交)后立即运行git gc,然后再紧跟着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 / expire-unreachable / prune的时间参数设置了从现在开始向前测量的过期截止点。例如,“now”表示过期/修剪所有内容,“30m”表示排除最近30分钟内的更改。


2
git reset --hard HEAD~1git push -f 的技巧非常实用,谢谢! - Liam
1
这个能在任何分支上工作吗?还是你必须在主分支上进行重置? - Jozef Legény
2
不必备份头提交,你可以故意创建一个噪音提交,将其推送,然后使用“HEAD〜1”技巧来清除该不需要的噪音提交。这似乎更安全和简单。 - Cheetah
2
在 Bitbucket Cloud 上对我来说并没有立即生效。我这样做了,之后我打开了一个工单,他们在服务器上激活了 GC。我读过以前他们每次推送后都会调用 GC,但现在他们只有时候这样做,所以如果你接近限制,就需要打开一个工单。 - cocorossello
4
请投票支持该功能,以便能够在网络界面上手动执行此操作,这样您就不必每次都创建一个支持请求:https://jira.atlassian.com/browse/BCLOUD-19771 - Marchy
显示剩余2条评论

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接