GitLabで管理しているリポジトリの過去のコミットを削除する方法
なぜやるのか
サイズの大きすぎるファイルを追加してしまい、cloneに時間が掛かるようになったのでrevertして事なきを得ようと思ったのですが、revertして削除してもcloneには時間がかかるまま~ということがありました。
(ロールバック時にファイルを復活できるように削除されたファイルもデータは保持しているようです)
目標
GitLabで管理しているリポジトリのmasterブランチに誤って追加したファイルをコミットログも含めて削除する。
注意
masterブランチの保護を外したり、コミットログを消すことになるので、状況次第では行わない方がよい場合があります。
準備
検証用に、ファイルを3つリモートリポジトリに追加します。
- ファイル1.txt
- ファイル2.txt
- 間違って入れたファイル.txt ←これを削除する
手順
1.masterブランチの保護を外す。
Projectのトップページを表示し、画面左端「Setting」→「Repository」を押下
「Protected Branches」を開いてmasterブランチの「Unprotect」ボタンを押下、続けて表示されるダイアログの「OK」ボタンを押下
※後で保護を戻すので設定内容をメモしておくことをおすすめします。
2.コミットログを確認する
$ git log commit 99107622d285a59fb09bde50999ff8673139840c (HEAD -> master, origin/master) Author: vagrant <vagrant@vagrant.vm> Date: Mon Mar 9 10:43:07 2020 +0000 間違って入れたファイル追加 commit 316cdb9fed1b3c47fd905ae01d9628ba106dfc39 Author: vagrant <vagrant@vagrant.vm> Date: Mon Mar 9 10:38:59 2020 +0000 ファイル2追加 commit f1698a296b1eb43785a1a7a61e1e8891eedf33b0 Author: vagrant <vagrant@vagrant.vm> Date: Mon Mar 9 10:34:58 2020 +0000 ファイル1追加
3.ローカルリポジトリでコミットを削除する
git reset --hard [残したい最新のコミットのハッシュ値]
[残したい最新のコミットのハッシュ値]で指定したコミットが最新になるように、それより後のコミットが消えます。
$ git reset --hard 316cdb9fed1b3c47fd905ae01d9628ba106dfc39 HEAD is now at 316cdb9 ファイル2追加
念の為コミットが消えているか確認
$ git log commit 316cdb9fed1b3c47fd905ae01d9628ba106dfc39 (HEAD -> master) Author: vagrant <vagrant@vagrant.vm> Date: Mon Mar 9 10:38:59 2020 +0000 ファイル2追加 commit f1698a296b1eb43785a1a7a61e1e8891eedf33b0 Author: vagrant <vagrant@vagrant.vm> Date: Mon Mar 9 10:34:58 2020 +0000 ファイル1追加
ローカルリポジトリ上は消えたようです。
4.リモートリポジトリにpushする
git push origin master -f
コミットログが遅れた状態(git視点では古いローカルリポジトリからのpush)なので-f
オプションで強制的にpushします。
5.masterブランチを保護する
手順1の画面まで進み、「Protect a branch」欄にある項目を元通りに設定して「Protect」ボタンを押下する
完了です。