弊社でとある写真投稿コンテストサイトを管理している。
データバックアップの為にcronで毎日投稿データを圧縮しgit add~pushしているのだがリポジトリサイズが巨大になりすぎたのでバックアップファイルを削除したのだが、うっかりgit rmではなくrm -rfで削除しgit commit -a -m “delete old backup files”してgit pushしてしまっていた。

上記操作で見た目はファイルは削除されたのだがリポジトリには残ったまま。
git resetで戻してから再度git rmで削除すればいいのだが何度も上記操作でやっていたのでめんどくさい。なので対象ファイルを一括で履歴から削除してみた。

以下その手順の覚書

git filter-branch --force --index-filter 'git rm --ignore-unmatch ./data_backup/*.tar.gz' --prune-empty --tag-name-filter cat -- --all

data_backup/*.tar.gzが対象ファイル
注意としてgit管理最上位フォルダでやること

これでとりあえず削除できたので、次にリポジトリにgcしてやります

git gc --aggressive --prune=now

最後にforceつけてpushすればOK

git push origin --force --all

たぶんできた。忘れない様にメモしておきます。