TD;DR
先日、業務にてGoogle Source Repo → Backlogへのリモートリポジトリ移管作業が発生しました。
移管といっても、基本的にはpushするremoteの目先を Google Source Repo → Backlog にして、pushするだけだろうと思っていたのですが、こういうエラーが出てきた。
remote: Large files detected. Please consider using Git LFS(Large File Storage).
remote: See https://xxx.backlog.jp/help/git-lfs-about for more information.
remote: File docker/xxx/hoge.zip exceeds Backlog's file size limit of 100M
remote: File docker/xxx/hoge2.tar.gz exceeds Backlog's file size limit of 100M
remote: File docker/xxx/hoge.zip exceeds Backlog's file size limit of 100M
どうも100Mを超えるファイルをpushしようとして怒られているらしい。
別段いらないファイルなのでフォルダ構成上からは削除して、再度pushしても同じエラーがでた。
…なぜ?
と考えて気づく。
ローカルのgitの履歴の中にこのファイルがいるんだなと。
というわけで、gitの歴史改変を行う必要があるのですが、その時にハマったことをこの記事では書いていきます。
まず最初に試したのは git filter-repo
エラーメッセージの内容でググると一番最初に出てきたのはこちらのブログだった。
書かれている通りにgit-filter-repoを入れて、以下コマンドを実行。
git filter-repo --path hoge.zip --invert-paths
git filter-repo --path hoge2.zip --invert-paths
git push --force origin master
で、上手くいくのかと思われたが、再びエラー。
remote: Large files detected. Please consider using Git LFS(Large File Storage).
remote: See https://xxx.backlog.jp/help/git-lfs-about for more information.
remote: File docker/xxx/hoge2.tar.gz exceeds Backlog's file size limit of 100M
どうもgit filter-repoを実行した一つ目のhoge.zipはきちんと消えている様子だったのだが、hoge2.zipが残ったままになっているっぽい。
なぜだかわからないが、 git filter-repo は複数のファイルを消すときには何度試してもうまくいかなかった。
これ、原因わかる方いらっしゃればぜひ教えてください
試せばよかったと思うこと
少なくともhoge.zipに関してはエラーと言われていないということは、こいつに関してはエラーが解消されているということになる。
かつ、もともと使っていたGoogle Source Repoにはエラーが出ずpushできているということは、
この段階で新たなリポジトリ(これは一時的に使いたいだけ)を作成し、まずはGoogle Source Repoへpush。
で、上で作ったリポジトリをcloneして、今度は hoge2.tar.gz をgit filter-repoする。
これでおそらく二つ目の hoge2.tar.gz も消えて、backlogのリモートリポジトリへpush --forceすればうまくいったのかもしれない。
次に試したのは BFG Repo-Cleaner
原因はローカルのgitの履歴に100Mを超えるファイルがあることというのははっきりわかっていたので、コミット履歴を改変する方法を探していると、以下のgithubのページへたどり着いた。
そこで紹介されていたのが、 BFG Repo-Cleaner 。
オープンソースコミュニティによって構築・メンテナンスされているツールのようです。
https://rtyley.github.io/bfg-repo-cleaner/
上記リンクの遷移先のページの右側にあるDownloadボタンを押すと、jarファイルが落ちてくる。

「マジで?jar?」
というわけで BFG Repo-Cleaner はjavaのランタイム環境がないと動かないみたいです。
私はjavaのランタイム環境はすでにあったので、特に準備なくすぐに使えましたが、ランタイム環境がない人は作りましょう。
ググればすぐにできます。
BFG Repo-Cleanerを使って歴史改変
先にダウンロードしたjarファイルを適当なディレクトリにおいて、その場所を指定して以下コマンドを実行します。
java -jar C:\work\bfg-1.14.0.jar --delete-files hoge.zip
java -jar C:\work\bfg-1.14.0.jar --delete-files hoge2.tar.gz
すると、git filter-repoよりもリッチなログが出てきて、歴史改変の結果を教えてくれます。
終わったら、あとはリポジトリにpush --forceするだけ。
git push --force origin master
これでうまくいった。