はじめに
GitHub上でプルリクを送った時、GitGuardianのチェックを引っ掛かる時があります。その時に引っ掛かったsenstiveなファイルをgit履歴上から完全に削除する方法を書きます。
git filter-branch --force --index-filter \
"git rm --cached --ignore-unmatch INSERT_PATH_TO_FILE_HERE" \
--prune-empty --tag-name-filter cat -- --all
実行例
git filter-branch -f --index-filter \
'git rm --cached -rf --ignore-unmatch bin/conf.txt' \
--prune-empty --tag-name-filter cat -- --all
git filter-branchで使うオプション
git filter-branchはオプションがたくさんつくので、非常に見づらいですね。
そこで、オプションの機能を一覧でまとめました。
オプション | 機能 |
---|---|
--setup [command] | 実行直前に1回限りコマンドを実行する |
--subdirectory-filter [directory] | 指定されたサブディレクトリに関連する履歴のみ調べる |
--env-filter [command] | 環境変数を変更するなどコミットが実行される環境を変更する必要がある場合にのみ使用。 |
--tree-filter [command] | 各チェックアウトに対してコマンドを実行し、結果を再コミット |
--index-filter [command] | インデックス上で、各チェックアウトに対してコマンドを実行し、結果を再コミット |
--parent-filter [command] | コミットの親リストを書き換えるためのフィルター |
--msg-filter [command] | コミットメッセージを書き換えるためのフィルター |
--commit-filter [command] | コミットごとのform用のフィルター |
--tag-name-filter [command] | --tag-name-filter catで使用し、タグを変更せず、タグが紐付けされているコミットIDを上書きする |
--prune-empty | 空のコミットを削除 |
--original [namespace] | 元のコミットが保存される名前空間を設定できる |
-d [directory] | 書き換えに使用される一時ディレクトリへのパスを設定できる |
-f or --force | filter-branchは実行ディレクトリが一時ディレクトリである場合、refs/original/に既にバックアップが存在する場合は実行できないので、強制的に実行する必要がある |
--state-branch [branch] | 退避用ブランチを指定できる。branchが存在しない場合は作成される |
[rev-list options]… | git rev-listの引数。このオプションに含まれるすべての参照が書き換えらる |
--all | すべてのブランチを指定 |
HEAD | チェックアウトしている(今自分が作業している)ブランチを指定 |
※commit前に一時的にステージングする場所がindex
引用元: git-filter-branch
pushする
下記のコマンドを実行しないと、GitHubに反映されないです。
git push origin --force --all