BitBucket の使用容量を削減するために Git の空ブランチを作ったりして対応した話

BitBucket は、無料アカウントだとワークスペース全体で 1GB という容量制限がある。画像などのちょっと重ためなデータを含む Git リポジトリをいくつか Push していたので、最近は git push する度に「そろそろ容量上限に近いっすよー」的なメッセージが出ていた。

そこで、「過去のコミット履歴をまっさらに削除して git push --force すれば良いんじゃね?」と思って作業してみたのだが、リモートサーバでの GC に時間がかかるのか、中々実際の容量が反映されずカツカツ状態に見えたままだった。

しびれを切らしたので、一度 BitBucket 上からリポジトリごと削除し、直後に同名で空のリポジトリを作成、予めローカルで過去コミットを削除しておいた最新のメインブランチのみを Push するという方法で、強制的に反映させることにした。

まずやってみたこと

BitBucket では「メインブランチ」を削除できなくなっているので、予め BitBucket 管理画面からメインブランチを mainmaster などから temp-branch など適当なモノに切り替えておく。そうすると、管理画面のブランチ一覧から main ブランチを削除できるようになる。コマンドラインで実行する場合は、以下でリモートブランチを削除できる。

$ git push origin --delete 【削除したいリモートブランチ名】

リモートからメインブランチが消えて、他のブランチもないので、使用量はほとんど 0KB になるんじゃないかと思っていたけど、リモートでの GC に時間がかかるのかコレでは上手く反映されず。

過去のコミット履歴を引き継がない、完全に空なブランチを新規作成する

次に、過去のコミット履歴を引き継がず、何のファイルもコミットしていない空のブランチというのを作成してみる。イメージ的には、main ブランチの流れとは無関係な gh-pages ブランチを作る時なんかにこの方法が活用できるかもしれない。

$ git checkout --orphan 【空で作りたいブランチ名】
# このままだと全ファイルが Add された状態になるので、以下で Unstaged にする
$ git reset
# 1ファイルもコミットされていない状態でファーストコミットを打てる
$ git commit --allow-empty -m 'First Empty Commit'

この --orphan というオプションが、過去のコミットを引き継がないように出来るポイント。コレを踏まえて実際にやっていく。

実際に BitBucket のリポジトリ容量を削減するためにやったこと

まずは BitBucket 管理画面より、対象のリポジトリを一度消してしまう。そしてすぐに、同名で新規リポジトリを作成する。コレで、リモートは何のブランチもなく、一つのコミットもないリポジトリとなった。使用容量もほとんど 0KB な状態だ。

それから、ローカルで「過去の履歴を捨てたメインブランチ」を作り、Push してやれば良い。リモートではリポジトリを作り直しているものの、リポジトリ名が同じなので git remote の設定も変えなくて済むし、Push 時も --force を付けて過去のコミットを上書きするような必要がない。

# メインブランチから、過去の履歴を引き継がない `temp-main` ブランチを作成する
$ git checkout --orphan temp-main
# 最新の `main` ブランチのファイルが全て Add された状態なので、コレをコミットする。ココで `temp-main` ブランチ内に初のコミットが出来上がる
$ git commit -m 'New Main'

# 旧メインブランチを削除する
$ git branch -D main

# `temp-main` ブランチから再度 `main` ブランチを切り出す
$ git checkout -b main

# 一時退避していたブランチは削除する
$ git branch -D temp-main

# 新しくなった `main` ブランチのみを Push する
$ git push

こんな感じ。

BitBucket 側でリポジトリをまるごと消しているので、GC も何も関係なく、強制的に容量削減ができた。様々な積み重ねで 900MB 近く消費していたところが、100MB ちょっとまで削減できたので、コレで良しとする。