Gitリポジトリから不要なファイルを削除したいような場合、直前ならばまだしも過去のコミットから削除しようとすると大変です。
そんな時に便利なのが「BFG Repo-Cleaner」です。
github.com
検索すればネット上にいろいろ情報はありますが、「あれ?Windowsのときはどうするんだ?」と検索結果を読みながら若干手探りなところがあったので、忘備録として記載しておきます。
背景
リモート側を別の場所に移行する必要に迫られてローカルリポジトリをpushしようとしたところ、過去のコミットで大きなファイル(その後はそのファイルはいらなくなったので削除もコミットされている)があるということでpushが失敗してしまいました。
Git LFSが使うという方法もあるのですが、いらないファイルなので該当ファイルを削除してからPushする方法をとりたい。
悩んだポイント
Windowsではbfgの実行はどこですればいいのか?
手順
bfgのダウンロード
GitHubのBFG-Windowsのリポジトリのリリースページからbgfのjarファイルをダウンロードします。
2022/05/09時点では1.13.0が最新です。
Release BFG-1.13.0 (2020-01-08) · wjk/BFG-Windows · GitHub
Open in Terminal
Visual Studioで該当ソリューションを右クリックして「Open in Terminal」を開きます。
これでソリューションのルートフォルダで「開発者用PowerShell」が起動できます。
java -jar c:\Users\hatsune\Downloads\bfg-1.14.0.jar --delete-files hogehoge.a .git
と入力すれば、ソリューションフォルダ直下の「.git」フォルダの内容を参照してリポジトリから「hogehoge.a」ファイルを削除してくれます。
正常に動作した場合は最後に次のように表示されます。
BFG run is complete! When ready, run: git reflog expire --expire=now --all && git gc --prune=now --aggressive
2つのgitコマンド、git reflog expireと git gcを実行するように即されていますね。
後処理
次に、ここがキモなのですが、「開発者用PowerShell」からいったん離れて「Git for Windows」や「SourceTree」などのコマンドプロンプトを開いて次のコマンドを実行します。
$ git reflog expire --expire=now --all && git gc --prune=now --aggressive
Enumerating objects: 24347, done.
Counting objects: 100% (24347/24347), done.
Delta compression using up to 4 threads
Compressing objects: 100% (23104/23104), done.
Writing objects: 100% (24347/24347), done.
Total 24347 (delta 18601), reused 4215 (delta 0), pack-reused 0
Removing duplicate objects: 100% (256/256), done.
リモートにpush
これであとはリモートにpushします。
$ git push -u origin master
リモートとローカルのリポジトリの整合性がとれないので怒られると思うので「-f」で強制プッシュします。
$ git push -f
まとめ
パスをきちんと設定しておけばよいのかもしれないけれど、「開発者用PowerShell」と「Gitツールのターミナル」の二刀流でサクッとやってしまうのもいいのかなと思いました。