【Bitbucket】リポジトリのサイズを減らすメモ

Bitbucketのリポジトリは2GBでハード制限という制限がかかります。
一度2GBの制限を超えるとpushできなくなります。

そんな中、1GBを超えてしまいソフト制限がかかってしまいました。警告が表示されるだけですが、このままいくと2GBを超えてしまいそうなのでメンテナンスが必要です。

そこで今回、リポジトリサイズを減らして、Bitbuketにpushするまでをメモとして残しておきます。

公式にも手順は書いてあるので、合わせてみてみてください。
https://ja.confluence.atlassian.com/bitbucket/reduce-repository-size-321848262.html

リポジトリのサイズを減らす

バックアップをとっておく

何かあった時のために、ローカルにCloneしてバックアップをしておきます。

–mirror フラグを使ってCloneする

まず、–mirrorフラグを使ってCloneします。

$ git clone --mirror git://example.com/example.git

BFGをダウンロード

Bitbucketの公式に書いてある通り、BFG Repo-Cleanerを使って履歴の書き換えを行います。

まずはじめに、BFGをダウンロードしておきます。
コマンドでも、ブラウザからzipでもどちらでも。

BFG Repo-Cleane
https://rtyley.github.io/bfg-repo-cleaner/

ダウンロードしたらCloneしたリポジトリと同じ階層に入れておきます。

BFGによる履歴の書き換え

以前gitから外した画像を削除したかったので、「.jpg」と「.png」がつくファイルをごそっと削除します。

//jpgを削除
$ java -jar bfg-1.13.0.jar --delete-files *.jpg example.git

//.pngを削除
$ java -jar bfg-1.13.0.jar --delete-files *.png example.git

他のやり方はBFG Repo-Cleaneの公式にも書いてあります。
ただ、フォルダやファイルを消すときに、
パスの指定をするわけではないので、同じ名前のものは一緒に消えてしまうようです。

ガベージコレクト

Gitのガベージコレクトを実行します。

cd example.gi
git reflog expire --expire=now --all && git gc --prune=now --aggressive

サイズを確認する

pushをする前に、サイズが減っているか確認します。

git count-objects -v 

size-packの値がリモートサーバーにpushされた時のサイズで、単位はキロバイトです。

pushする

さて、無事サイズが減ったことを確認したので、Bitbucketにpushします。

git push --force 

ウェブブラウザ(Bitbucket)でサイズを確認

Bitbucket上でサイズが減っていたらこれで完了です。

Bitbucketにpushできないとき

いざpushする時に、権限がないと怒られました。

Bitbucketのアクセスキーはリポジトリごとと、アカウントごとに登録ができ、
リポジトリにしか登録していないと、今回のような時にはpushできないようです。

アカウントの「設定」ページにも「SSH 鍵」とう項目がありますので、そこで鍵を追加すればOKです。

Bitbucket(ブラウザ)上でサイズが変わらないとき

push後60分経ってもBitbucket上でサイズが変わらない時、はサポートに連絡してみましょう。日本語サポートもありました。

今回悩みに悩んだのが、Gitの履歴を書き換えてpushしてもブラウザ上でサイズを確認すると減らないどころか、増えていることでした。

はじめ1.5GBだったのがpush後1.9BGに増えてしまい、
もう2GB目前です…。

もう一度公式ページを読んでいると、こんな注意書きが。

If you’ve reduced the repository size locally and made a force push and still have a limitation after 60 minutes, you can contact support to run a git gc on the server for you.

https://ja.confluence.atlassian.com/bitbucket/reduce-repository-size-321848262.html

強制的にpushしても60分後に制限ある時はサポートに連絡してという内容のようです。

再度Cloneしてサイズが減っていることを確認したあと、サポートに連絡しました。
割とすぐ返事をいただくことができ、git gc をして頂いたところ無事Bitbucket上でも1GBを下回ったことを確認できました。

最後に

結果無事メンテナンスできましたが、Bitbucket上でサイズが減らなかったことで、このやり方であっているのかというのが断言できない状態です。

ただ、ローカルでサイズを確認した限り履歴の書き換えはできていたので、メモとして残しておきます。
修正があれば編集する予定です。