【緊急】Git履歴から機密情報を抹消せよ:`git-filter-repo`による外科手術の全貌
エンジニアたるもの、いつかは踏む「パスワードのコミット」という地雷。`.env`を誤ってプッシュした瞬間、血の気が引く感覚を経験したことがあるだろう。
ここで重要なのは、「直前のコミットを消す(git reset)」だけでは不十分という事実だ。Gitの歴史に刻まれたその機密情報は、リモートリポジトリの奥深くに残り続け、CI/CDのキャッシュやチームメンバーのローカル環境に伝播する。
今日は、廃止された`git-filter-branch`などという化石は捨て去り、現代のデファクトスタンダードである`git-filter-repo`を用いた、「歴史の書き換え(外科手術)」の全手順を伝授する。
—
1. なぜ `git-filter-repo` なのか?
`git-filter-branch`は遅い。そして何より、リポジトリの整合性を破壊するリスクが高い。
対して`git-filter-repo`は、Gitの内部構造(リポジトリのオブジェクトグラフ)を直接操作する設計思想を持っており、圧倒的に高速かつ安全だ。
導入
Python環境があれば一発
pip install git-filter-repo
—
2. 現場で震えるほど役立つ「機密抹消」のワークフロー
まず大前提として、この操作はチーム全員の作業を止める「破壊的変更」である。事前にSlackで通知し、作業後は強制プッシュ(`push –force`)を行う必要がある。
ステップ1:特定のファイルを歴史から抹消する
例えば、誤ってコミットした `config/secrets.yaml` を抹消する場合。
該当ファイルをリポジトリ全体から完全に削除
git filter-repo –path config/secrets.yaml –invert-paths
`–invert-paths` オプションが肝だ。「指定したパス以外を残す」という強力なフィルターをかける。
ステップ2:もっと広範囲に消したい場合(正規表現)
ディレクトリごと、あるいは拡張子で消したい場合も簡単だ。
パスワードが含まれるファイルや巨大なバイナリを一掃
git filter-repo –path-glob ‘.p12’ –path-glob ‘certs/’ –invert-paths
—
3. プロの現場で差がつく「隠れたハック」
① .gitconfig の神設定:事故を防ぐ最強の味方
そもそも「事故」を防ぐ設定を入れていないのは怠慢だ。個人の`.gitconfig`に以下を追加せよ。
[core]
# 巨大なファイルがコミットされたら警告を出す(git 2.30+)
bigFileThreshold = 50m
[alias]
# 歴史書き換え時のヒューマンエラーを防ぐためのカスタムコマンド
# 最後に何が変わったかを確認する癖をつける
lg = log –graph –oneline –all –decorate
② 実用的な `.gitignore` のベストプラクティス
環境変数や機密情報は「テンプレート」をリポジトリに入れるのが鉄則だ。
`.gitignore` の鉄板構成例:
秘匿情報
.env
.env.
!.env.example # テンプレートは残すのがマナー
IDEやツール設定
.vscode/
.idea/
.swp
ビルド成果物・バイナリ
dist/
build/
.bin
—
4. チーム開発における「強制」と「共有」
歴史を書き換えた後、チームに混乱を招かないためのテックリード的ルールがこれだ。
1. `git-filter-repo` 後は、リポジトリを再クローンさせる
- 中途半端に `git pull` すると歴史が分岐して地獄を見る。全員に `git clone` し直させ、ローカルの `branch` は削除させるのが最も安上がりだ。
2. プッシュ制限をかける
- GitHub/GitLabのブランチ保護設定で「強制プッシュ(Force Push)」を禁止しておくのが基本だが、今回は例外的に一時解除し、終わったら即座に再有効化する。
3. CI/CDのキャッシュをクリアする
- GitHub Actionsのキャッシュなど、古いリポジトリの断片が残っている可能性がある。履歴を抹消した後は、CIのキャッシュを全削除するのがプロの作法だ。
—
5. 最後に:ツールの真の実力は「運用」にある
`git-filter-repo` は強力なメスだ。しかし、最も重要なのは「メスを入れなくて済む環境作り」である。
- Secrets Detection: `gitleaks` などのツールをCIパイプラインに組み込み、コミット前に検知する。
- Infrastructure as Code: 機密情報はリポジトリに含めず、AWS Parameter StoreやHashiCorp Vaultから動的に注入する。
「誤ってコミットした」という事象は、プロセスに欠陥がある証拠だ。「ミスをしてもシステムが防御してくれる」という自動化の仕組みこそが、真のDevOpsである。
この記事が、あなたのリポジトリから「負の遺産」を消し去る一助となれば幸いだ。さあ、今すぐターミナルを開き、過去のしがらみを外科手術せよ。