読者です 読者をやめる 読者になる 読者になる

人生リアルタイムアタック

当面はPython学習帳

gitで特定ファイルの歴史をまるっと削除する

githubなどへアップしているファイルで、username/password/addressなどが含まれているファイルの歴史をまるっと削除したい時に。 歴史が変わるので複数人で触っているリポジトリは何かと問題が発生します。今回は個人リポジトリ前提で。

git version 2.4.6

事前準備

該当ファイルは削除時に物理ファイルごと無くなる為、事前に退避させておきます。

$ mv ./keshitai-file.txt ~/tmp/

歴史から消す

git filter-branch -f --tree-filter 'rm -f keshitai-file.txt' HEAD # 消したいファイル
git filter-branch -f --tree-filter 'rm -rf keshitai-directory/' HEAD # 消したいディレクトリ

-f の位置はここじゃないとダメなようです。
実行すると以下のようなログが出力されるハズ。

$ git filter-branch -f --tree-filter 'rm -f .gitconfig' HEAD
Rewrite 3025e991b4db7b79034358ee14b74446379d3fb1 (357/357)
Ref 'refs/heads/master' was rewritten

次にgitをcleanupします。

$ git gc --aggressive --prune=now
Counting objects: 4113, done.
Delta compression using up to 4 threads.
Compressing objects: 100% (4069/4069), done.
Writing objects: 100% (4113/4113), done.
Total 4113 (delta 1718), reused 629 (delta 0)

これで該当ファイルは歴史から修正されました。物理ファイルもなくなっているのでくれぐれも注意。

無事に終わったらリモートにpushします。歴史が書き換わっている為 -f オプション必須です。こちらもpushしたら完全に消えるので注意。

$ git push -f

終わり。