はじめに
gitlabのフリー版は2022-10-19から最大5GB、5人までに制限されることになった。プロジェクトの「設定」-「割当使用率」から「Seats」タブを見ると割当て人数が、「ストレージ」タブを見ると使用サイズを確認できる。
間違えてあげてしまった画像などの影響でリポジトリが大きくなってしまっている場合のリポジトリサイズ削減手順をメモする。
基本的なことはgitlabのdocに書いてある。
gitlabに固有なのはリポジトリがデフォルトでロックされており、git push --forceが効かないこととクリーンアップ手順。
以下はmacOS 12.5での作業。
git version 2.32.0 (Apple Git-132)を使用。
警告
基本的にはリポジトリの履歴を書き換えるべきではありません。以下の手順では過去のコミット番号も変わってしまうため、Commit IDを記載したメッセージやリンクは役に立たなくなります。また、記事には誤記があるかもしれませんので、事前にリポジトリ全体をバックアップするなどの注意が必要です。本記事を参考にして作業する際は、自己責任で行なってください。
手順
やりたいこと:gitlabで管理されたリポジトリから大きなファイルを探して履歴から削除する。
0. 準備
同様のコマンドのgit-filter-branchを使おうとすると、git-filter-repoを勧められる。
brew install git-filter-repo
1. git cloneする
git clone project_path.git
2. 巨大ファイルを探す
git_find_big.shを使って大きなファイルを探す。macOSのzshだと動かないのでbashで呼び出す。
cd project_name
bash path/to/git_find_big.sh
3. git-filter-repoでローカルリポジトリでのファイル削除
ここからの作業は十分注意して行うこと。例えば、ファイル"file.ext"を削除する場合。--invert-pathsを入れないと"file.ext"以外が削除されてしまい、悲惨なことになる。フォルダを指定すればフォルダごと削除されてしまう。過去のコミット番号も変わってしまうため、Commit IDを記載したメッセージやリンクは役に立たなくなります。一度、git-filter-repoを呼び出したら、後の手順で利用するcommit-mapが書き変わるため、複数回git-filter-repoを呼び出したい場合は、毎回最後まで手続きを進める必要があります(もっと良い方法があるのかもしれませんが...)。
git filter-repo --path path/to/file.ext --invert-paths
4. リモートリポジトリの設定変更(Allowed to force push)
デフォルトではgit push --forceが効かないので、次にgit push -fする前にここにあるようにプロジェクトのサイトからSettings > Repository > Protected branches で表示される画面でブランチの"Allowed to force push"をONする
5. リモートリポジトリを再追加
git-filter-repoでリモートリポジトリの設定が削除されるので手動で追加する。
git remote add origin project_path.git
6. リモートリポジトリを強制アップデート
git push origin --force --all
7. commit-mapを作成する
commit-mapを作成し、取り出す。
git filter-repo --analyze
cp .git/filter-repo/commit-map .
8. 30分待つ
gitlabでは次のステップのリポジトリのクリーンアップは30分以上前のオブジェクトに対してのみ実行されるので、30分待つ。
9. リポジトリのクリーンアップ
gitlabのサイトでプロジェクトの設定へ行き、Settings > Repositoryから、Cleanupを選択する。
commit-mapファイルをアップロードして、"Start cleanup"ボタンを押す。
10. リモートリポジトリの設定変更(Allowed to force push)
手順4の設定を元に戻す("Allowed to force push"をOFFにする)。
以上