はじめに
Gitリポジトリに機密ファイルや大容量ファイルを誤ってコミットしてしまった場合、
git rm だけでは履歴から完全に消せません。
Windows環境・pipインストール・python -m git_filter_repo を使い、
履歴から完全にファイルを削除したので、備忘録も兼ねて記載します。
注意事項
安全のため、clone したての新鮮なレポジトリで操作します。
この操作はリポジトリの全履歴を書き換えます。
他の開発者は再クローンが必要です。
必ずバックアップを取ってから実施してください。
前提
- Windows環境
- Gitがインストール済み
- Pythonがインストール済み(pipを使います)
削除したいファイル例:secret/sample_secret.txt
手順
- 対象リポジトリをクローン
git clone https://github.com/YOUR-USERNAME/YOUR-REPOSITORY.git
cd YOUR-REPOSITORY
- git-filter-repoのインストール
pip install git-filter-repo
- 削除対象ファイルが履歴に存在するか確認
履歴が表示されれば、削除対象が存在します。
git log --all -- "secret/sample_secret.txt"
- 履歴からファイルを完全削除
※ファイルがリネーム・移動されていた場合は、追加で--pathを指定してください。
python -m git_filter_repo --sensitive-data-removal --invert-paths --path "secret/sample_secret.txt"
- 削除できたか再確認
何も表示されなければ削除成功です。
git log --all -- "secret/sample_secret.txt"
- 影響を受けるマージリクエストの確認(必要に応じて)
findstr /R "^refs/merge-requests/.*/head$" .git\filter-repo\changed-refs | find /C /V ""
※GitHubの場合はrefs/pull/、GitLabの場合はrefs/merge-requests/になります。
- リモートへ強制プッシュ
git push --force --mirror origin
refs/merge-requests/やrefs/pull/へのpushエラーは無視して問題ないです。
まとめ
Windows環境でもpip+python -m git_filter_repoで安全に履歴クリーンアップができました。
履歴から消したいファイルがある場合は、参考にしてください。