おがみたは衰退しました

プログラミング系の備忘録など

Git LFSの管理から特定の拡張子のファイルを履歴含めて一気に消す方法

はじめに

GitHubLFSのBandwidthは初期状態だと1GB/月です。
現在制作しているプロジェクトにおいてGitHub ActionsでCIを導入したのですが、Bandwidthをどんどん削っており、1GB/月を超えそうでまずい状況でした。
現在制作しているプロジェクトは大きいサイズのファイルがなくpngの容量が小さいファイルが多く、そもそもLFSで管理する必要性がそこまでなかったため、LFSで管理するのをやめる方法を調べました。
いくつか嵌ったので備忘録として残しておきます。

また、下記の手順を使った場合Bandwidthの削減には役に立ちますが、GitHubリポジトリにあるLFSのファイルが削除されるわけではありません。
下記のページによるとGitHubリポジトリにあるLFSのファイルを削除したい場合はリポジトリを削除して再作成するしかないとのことです。。
ファイルを Git Large File Storage から削除する - GitHub Docs

Git LFSの管理から特定の拡張子(png)のファイルを履歴含めて一気に消す手順

※注意:コミット履歴の改変やgit push -f 等の事故が発生しやすい操作を行うため、事故を100%起こしたくない場合は行わないようにお願いいたします。

下記では例としてpng拡張子での手順を記載しています。

・1:.gitattributes でのpngLFSの設定を削除

変更前

*.png filter=lfs diff=lfs merge=lfs -text

変更後




・2:BFGをダウンロード
下記リンクのDownloadからBFGのjarファイルを取得します。
現時点ではbfg-1.14.0.jarがダウンロードできます。

rtyley.github.io

・3:BFGを用いてコミット履歴からpng拡張子のファイルを完全に削除しステージングエリアに
2でダウンロードしたBFGのbfg-1.14.0.jarをGitのリポジトリのルートに配置します。
git bash等を開き、下記コマンドを実行します。

java -jar bfg-1.14.0.jar --no-blob-protection --delete-files '*.png'

・4:ローカルのgitリポジトリからLFSのアンインストール
下記コマンドを実行します。

git lfs uninstall

・5:png拡張子の全ファイルをステージングエリアから一旦Gitの管理対象外にする
(※要検証:正確な内容ではないかもしれません)

下記コマンドを実行します。

git rm --cached *.png

ステージングエリアにあるファイルをGitの管理対象外にせずに再度コミットしてしまうと、LFS管理のままコミットされてしまうようです。

・6:LFS管理から外れたpngファイルを再度Git管理対象にする

git add -A
git commit -m "LFS管理から外れたpngファイルを再度追加"

下記コマンドでLFS管理のファイル一覧を確認することができ、pngが管理から外れているかどうかを確認できます。

git lfs ls-files

・7:git pushする
下記コマンドを実行します。

git push -f

コミット履歴の改変が行われているため、pushの際に-fをつける必要があります。

参考

ファイルを Git Large File Storage から削除する - GitHub Docs

機密データをリポジトリから削除する - GitHub Docs

Git LFS での管理を停止する - Vがいる日々

Git LFS管理しているファイルを通常のGit管理に戻す方法|nanase|note

notchained.hatenablog.com