如何在Bitbucket上减小Git仓库的大小?

37

我的问题概要:在我将几百字节添加到两个现有文件中后,Bitbucket上我的一个私人代码库大小突然增加了一倍以上。该代码库现在超过2GB,导致Bitbucket将其置于只读模式。由于它处于只读模式,我无法推送可以减小代码库大小的更改。(进退两难)

详细信息:我们公司最近开始在Bitbucket上托管git代码库。我负责的其中一个代码库大小约为973MB,接近1GB的软限制。为了缩小代码库的大小,我按照Bitbucket文档文章“将代码库拆分为两个”中的说明,将约450MB的文档和在线帮助文件移动到了它们自己的私人代码库中。然后,我按照Bitbucket文档文章“减少代码库大小”“维护Git代码库”中的说明进行操作,具体如下:

git count-objects -vH显示了一个大小约为973MB的size-pack。

我运行了git filter-branch --index-filter 'git rm --cached --ignore-unmatch doc' HEAD来删除doc目录(即我移动到新代码库中的内容)。

我运行了以下命令来过期引用和修剪:

git for-each-ref --format="%(refname)" refs/original/ | xargs -n 1 git update-ref -d
git reflog expire --expire=now --all
git gc --prune=now

git count-objects -vH 显示了一个大小为 881.1 MiB 的 size-pack,du -sh .git/objects 返回了 882M。我很失望移动了超过 450MB,仅减少了不到 90MB 的存储库大小,但还是将更改推送到了 Bitbucket:

git push --all --force
git push --tags --force

在Bitbucket仓库的设置页面,仍显示973MB大小。我登出、刷新浏览器、重新登录,但都没有用-仓库大小仍保持在973MB。

今天早上(在上述更改三天后),我对两个现有文件进行了几处小修改,将这些文件的大小总共增加了不到1KB,将其添加并提交到我的本地仓库,然后将更改推送到Bitbucket。几分钟后,我查看了仓库的Bitbucket页面,并看到一个红色警告横幅通知我“此存储库超过2GB限制,并处于只读模式”。现在设置页面显示仓库大小为2.3GB。

根据Bitbucket的记录,最近三天远程仓库中的唯一活动是将几百个字节添加到两个文件中。该推送可能并不是导致仓库大小增加了一倍以上的原因,但两个事件在时间上密切相关。

git reflog show返回空值。

将新副本克隆到备用目录,然后运行git count-objects给出一个881.29 MiB的尺寸包。

本地仓库位于CentOS 6.5系统上。git版本为1.8.5.3。

问题

  1. 为什么将450MB的文件移出仓库后,本地仓库的大小只减少了90MB?
  2. 即使有这个小的减少,为什么它也没有推送到Bitbucket的远程仓库中?
  3. 远程仓库的大小怎么会从973MB跳到2.3GB?
  4. 我该如何修复?即使使用--force标志进行推送,我也无法向远程仓库推送。任何推送都会给我带来错误消息“conq: repository is in read only mode (over 2 GB size limit).fatal: Could not read from remote repository.”

3
听起来像是你应该向 Bitbucket 的支持团队提出的问题 :-/ - Aaron Digulla
2
@dgvid 实际上我也遇到了同样的问题(添加了一个几千字节大小的文件,仓库的大小就膨胀了)- 请告诉我你发现了什么。 - Phil Birnie
@PhilB 请看我的回答。底线是:未知。 - dgvid
5个回答

38

我发现,如果您的Bitbucket存储库超过了2GB的限制,最简单的减小存储库大小的方法是:

  1. 在Bitbucket上创建一个分支
  2. 在Bitbucket上删除该分支

这将触发Bitbucket在存储库上运行git gc


2
这只有在你超过2GB的时候才有效吗?因为我只有1.5GB,这个技巧不起作用。 - Warface
1
很高兴我能帮上忙!是的,@Warface,只有当存储库大小超过2GB时才有效。这是Bitbucket实施的一项措施。 - slimeygecko
2
它对我没用。我的存储库是2.1 GB,在执行此过程后,现在变成了3.6 GB。我正在尝试使用https://rtyley.github.io/bfg-repo-cleaner/。 - manuelpgs
2
2019 年,这对我很有帮助。点击“创建”分支,删除它,几分钟后我就可以看到我的仓库大小已经减小了。 - tylersDisplayName
1
我不知道有任何方法可以从Bitbucket本身触发垃圾回收。 - slimeygecko
显示剩余4条评论

32

在与Bitbucket的技术支持交流后,我现在可以回答一些自己的问题:

  1. 为什么将450MB的文件移出版本库后,本地版本库的大小仅减少了90MB?是历史记录中遗漏了一些东西。我不知道具体是什么,但是filter-branch命令遗漏了某些内容。通过运行实用工具BFG Repo-Cleaner,我成功地将版本库大小减小了450MB。
  2. 为什么即使有这样的小幅度缩减也没有推送到Bitbucket上的远程版本库中?它已经推送了,但是Bitbucket的支持人员必须在他们的端上运行git gc。您可以联系Bitbucket请求并要求他们在版本库上运行git gc。
  3. 远程版本库的大小为什么从973MB跳到2.3GB?不知道。Bitbucket的技术支持人员也无法解答这个问题。
  4. 我该怎么办?联系Bitbucket支持人员。他们可以将存储库重新放回可读写模式,以便您可以推送较小的存储库并且他们可以在他们的端上运行git gc。

11
+1表示联系支持 - 我的经验基本相同。 - Phil Birnie
2
第四点:有一种替代方案可以避免联系支持团队:git reset --hard HEAD~1; git push -f - 但是请务必先备份! - Jackson Pauls
git reset --hard HEAD~1; git push -f 对我没用,我仍然收到超过限制的消息。我已经联系了支持,正在等待答复 :/ - Juancho
这个类似问题的答案意味着您不需要联系Bitbucket支持。 - Liam
所以,对于1的-1(它将重写历史 - 不好),对于其余部分的+1。总和= 0。 - 0andriy
显示剩余3条评论

3

远程仓库大小为什么会从973MB跳到2.3GB?

这是Bitbucket云端已知的一个bug,详见BCLOUD-19794

垃圾文件间歇性地被计入了仓库大小。

当推送到远程仓库后,会触发一次GC,随后生成一个垃圾文件。该垃圾文件会在下一次GC时清除。在这两次GC之间,由于垃圾文件大小间歇性地被计入到仓库总大小中,因此Bitbucket UI中显示的仓库大小是错误的。

如解决方法部分所述,您需要联系Bitbucket手动运行GC。

如果有足够多的人投票支持,Bitbucket可能会更快地采取行动。


1
我的代码库因为一个不到1k的提交而增加了一倍。https://jira.atlassian.com/browse/BCLOUD-19794 11个月过去了,这个问题仍然没有被分配,并且在长期待办事项中等待足够的社区响应来采取行动。请投票支持。 - Paul Childs

3

首先使用以下命令检查本地存储库的大小:


git count-objects -Hv

我们可以使用以下命令。
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"

现在,再次使用命令git count-objects -Hv来注意存储库的大小和垃圾变化。

虽然我们不得不联系 Bitbucket 触发其端的 GC 以减小仓库大小,但这些命令帮助我们清理了本地仓库。谢谢。 - Waqas

1
正如熟悉git的人所知道的那样,git存储文件的版本历史记录,因此进行更改并推送文件不会减少您的仓库大小。但是,在Bitbucket、GitHub、GitLab等平台上,仍有几种方法可以减小仓库大小。最好的方法是删除分支,因为这将永久删除该分支记录的任何文件,只要它没有被其他分支跟踪。但是,您可能希望保留该分支中的最新文件,因此请执行以下操作:
  1. 在本地机器上创建一个重复的仓库。(备份,以免丢失信息)
  2. 删除要移动或创建新版本的分支。您可以使用--cached来删除远程分支。
  3. 如果您想刷新分支,可以将文件复制到新分支并推送。
  4. 如果您想创建新的远程仓库,也可以这样做。
根据主机的不同,您可能需要运行特殊命令,但在大多数情况下,这应该起作用。

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