繁体   English   中英

如何减少 Bitbucket 上的 git repo 大小?

[英]How to reduce git repo size on Bitbucket?

我的问题摘要:在向两个现有文件添加几百个字节后,我在 Bitbucket 上的一个私人存储库的大小突然增加了一倍多。 存储库现在超过 2GB,这导致 Bitbucket 将其置于只读模式。 因为它处于只读模式,所以我无法推送会减少 repo 大小的更改。 (第 22 条。)

详细信息:我的公司最近开始在 Bitbucket 上托管 git 存储库。 我负责的其中一个存储库的大小约为 973MB,令人不安地接近 1GB 的软限制。 为了减少存储库的大小,我按照 Bitbucket 文档文章将存储库分成两部分中的说明操作,并将价值约 450MB 的文档和在线帮助文​​件移动到他们自己的私有存储库中。 然后我按照 Bitbucket 文档文章Reduce repository sizeMaintaining a git repository 中的说明进行操作,特别是:

git count-objects -vH向我展示了一个大约 973MB 的大小包。

我运行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 的大小包, du -sh .git/objects返回了 882M。 我很失望移动超过 450MB 将 repo 大小减少了不到 90MB,但仍然将更改推送到 Bitbucket:

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

该存储库的 Bitbucket 副本的设置页面继续显示 973MB 的大小。 我注销,刷新浏览器,重新登录,但这没有帮助——repo 大小保持在 973MB。

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

根据 Bitbucket 的说法,向两个文件添加几百字节的推送绝对是过去三天在远程存储库上发生的唯一活动。 这种推动可能不是回购规模增加一倍以上的原因,但这两个事件在时间上密切相关。

git reflog show返回任何内容。

将新副本克隆到备用目录中,然后运行 ​​git count-objects 会得到 881.29 MiB 的大小包。

本地存储库位于 CentOS 6.5 系统上。 git 版本是 1.8.5.3。

问题

  1. 为什么将 450MB 的文件移出 repo 只会将我的本地 repo 的大小减少 90MB?
  2. 为什么即使是适度的减少也没有被推送到 Bitbucket 上的远程存储库?
  3. 远程仓库的大小究竟是如何从 973MB 跃升到 2.3GB 的?
  4. 我如何解决它? 即使使用 --force 标志,我也无法推送到远程仓库。 任何推送都会让我收到错误消息“conq:存储库处于只读模式(超过 2 GB 大小限制)。致命:无法从远程存储库读取。”

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

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

这应该会触发 Bitbucket 在 repo 上运行git gc

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

  1. 为什么将 450MB 的文件移出 repo 只会将我的本地 repo 的大小减少 90MB? 历史上的某些东西被遗漏了。 我不知道到底是什么,但是 filter-branch 命令遗漏了一些东西。 通过运行实用程序BFG Repo-Cleaner ,我能够成功地将 repo 大小减少了 450MB。
  2. 为什么即使是适度的减少也没有被推送到 Bitbucket 上的远程存储库? 确实如此,但 Bitbucket 支持必须在他们身边运行 git gc。 可以联系 Bitbucket 请求并要求他们在 repo 上运行 git gc。
  3. 远程仓库的大小究竟是如何从 973MB 跃升到 2.3GB 的? 未知。 Bitbucket 技术支持也没有答案。
  4. 我如何解决它? 联系 Bitbucket 支持。 他们可以将存储库恢复为读写模式,以便您可以推送较小的存储库,并且他们可以在其末端运行 git gc。

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

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来注意存储库大小和垃圾的变化

远程仓库的大小究竟是如何从 973MB 跃升到 2.3GB 的?

这是 bitbucket 云端的一个已知错误,请参阅BCLOUD-19794

垃圾文件间歇性地计入存储库大小。

当推送到远程存储库时,随后会触发 GC,从而生成垃圾文件。 这个垃圾文件在下一次后续 GC 中被清除。 在这两个 GC 之间,存储库的大小在 Bitbucket UI 中显示不正确,因为垃圾文件大小间歇性地计入存储库总大小。

如变通方法部分所述,您需要联系 bitbucket 以手动运行 GC。

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

我相信那些熟悉的人已经知道了,但是 git 会存储您的文件版本历史记录,因此进行更改和推送文件不会减少您的存储库大小。

还有几种方法可以减少 bitbucket、GitHub、gitlab 等上的 repo 大小。最好的方法是删除分支,因为这会永久删除该分支记录的任何文件,只要它不被另一个分支跟踪即可。 但是您可能需要该分支中的最新文件,因此请执行以下操作:

  1. 在本地机器上,创建一个重复的 repo。 (备份,所以你不会丢失信息)
  2. 删除要移动的分支,或为其创建新版本。 您可以使用--cached删除远程分支。
  3. 如果要刷新分支,可以将文件复制到新分支并推送。
  4. 如果你想创建新的远程仓库,你也可以这样做。

根据主机的不同,您可能必须运行特殊命令,但这在大多数情况下应该有效。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM