はつねの日記

Kinect, Windows 10 UWP, Windows Azure, IoT, 電子工作

BFG Repo-CleanerをWindowsで使って、gitリポジトリからファイルを削除する

Gitリポジトリから不要なファイルを削除したいような場合、直前ならばまだしも過去のコミットから削除しようとすると大変です。
そんな時に便利なのが「BFG Repo-Cleaner」です。
github.com

検索すればネット上にいろいろ情報はありますが、「あれ?Windowsのときはどうするんだ?」と検索結果を読みながら若干手探りなところがあったので、忘備録として記載しておきます。

前提

  • Visual Studio 2022を使っていて、OpenJDKもインストール済

  • SourceTreeと使っている(Git for Windowsなどでもよい)

背景

リモート側を別の場所に移行する必要に迫られてローカルリポジトリをpushしようとしたところ、過去のコミットで大きなファイル(その後はそのファイルはいらなくなったので削除もコミットされている)があるということでpushが失敗してしまいました。
Git LFSが使うという方法もあるのですが、いらないファイルなので該当ファイルを削除してからPushする方法をとりたい。

悩んだポイント

Windowsではbfgの実行はどこですればいいのか?

手順

事前準備

事前にGitリポジトリをcloneしておくと万が一失敗したときにリカバリーできるそうです。

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ツールのターミナル」の二刀流でサクッとやってしまうのもいいのかなと思いました。