「まずい、.env をそのまま commit してしまった」——気づいた瞬間、手が止まる経験をされた方は多いのではないでしょうか。
2014年から個人でアプリを開発し続けてきた私にとって、これは他人事ではありません。AdMob のキー、Stripe の本番キー、Anthropic の API キー。複数のサービスを組み合わせて動かす個人プロダクトでは、.env ファイルの管理が少しでも緩むと、一瞬で全ての認証情報が公開リポジトリに乗ってしまうリスクがあります。
ここではすでにコミットしてしまった後に取るべき手順を、時間順に整理してお伝えします。発覚から30分以内に全て完了できるよう、各ステップを具体的にまとめました。
最初の5分でやること — キーのローテーション
履歴の書き換えより先に、必ずこちらを済ませてください。git の歴史を消しても、コミットしていた間に誰かがキーをコピーしていた可能性はゼロではありません。
Anthropic API キーを漏洩した場合:
- console.anthropic.com にログイン
- 「API Keys」→ 該当キーを「Revoke」
- 新しいキーを発行してローカルの
.envを更新
Google AdMob / Firebase キーを漏洩した場合:
- console.firebase.google.com → プロジェクト設定 → 「サービスアカウント」または「APIキー」
- 該当キーを無効化し、新しいキーを発行
Stripe キーを漏洩した場合:
- dashboard.stripe.com → Developers → API keys
- 本番キーは「Roll」(ローテーション)で即座に無効化できます
キーのローテーションが完了したら、次のステップに進みます。
被害範囲を確認する
コミット履歴を確認し、漏洩したキーがどのコミットに含まれているか把握します。
# APIキーが含まれているコミットを探す
git log --all --full-history -- .env
# 特定の文字列がいつから含まれているか確認
git log -S "sk-ant-" --all --onelineリポジトリがすでにリモート(GitHub等)に push されている場合は、Settings → Secrets scanning → Alerts を確認してください。GitHub は自動的にAnthropic APIキーなどの形式を検出してアラートを出します(検出されている = すでにスキャンされた可能性がある)。
git 履歴から完全に削除する
方法1: git-filter-repo(推奨)
# git-filter-repo のインストール(pip または Homebrew)
pip install git-filter-repo --break-system-packages
# または
brew install git-filter-repo
# .env ファイルを履歴から完全削除
cd /path/to/your-repo
git filter-repo --path .env --invert-paths --force
# リモートに強制push
git remote add origin https://github.com/your-user/your-repo.git
git push origin --force --all
git push origin --force --tags--invert-paths で「指定パス以外を残す」という意味になります。.env ファイルそのものが履歴から消え、過去の全コミットからも除去されます。
方法2: git filter-branch(古い環境向け)
git-filter-repo が使えない環境では、従来の filter-branch を使います。
git filter-branch --force --index-filter \
"git rm --cached --ignore-unmatch .env" \
--prune-empty --tag-name-filter cat -- --all
# リモートに強制push
git push origin --force --allClaude Code に依頼する場合
Claude Code に頼む場合は、以下のように明示的に指示してください。
.envファイルをgit履歴から完全に削除してください。
git filter-repoを使い、--invert-pathsオプションで.envを除外します。
その後、リモートにforce pushしてください。
リポジトリのURLは https://github.com/your-user/your-repo.git です。
「コミット履歴が変わるので確認が必要」という形で途中で止まる場合があります。その時は「確認不要です、実行してください」と追加で伝えると進みます。
協力者への連絡(チームがいる場合)
git push --force は他の開発者の手元のブランチと履歴が食い違う原因になります。force push 後に全員が以下を実行する必要があります。
# チームメンバーが実行すること
git fetch origin
git reset --hard origin/main一人で開発している場合は不要です。
.gitignore に .env を追加する
履歴削除が完了したら、再発防止の設定を確認します。
# .gitignoreに.envが含まれているか確認
cat .gitignore | grep -E "^\.env$"
# 含まれていなければ追加
echo ".env" >> .gitignore
echo ".env.local" >> .gitignore
echo ".env.*.local" >> .gitignore
# .gitignoreをコミット
git add .gitignore
git commit -m "chore: add .env to gitignore"
git push origin mainすでに .gitignore に .env を書いていたのに commit されてしまったという場合は、ファイルがすでに git の追跡対象になっていた可能性があります。その場合はキャッシュを削除します。
# gitのキャッシュから.envを除去(ファイル自体は残る)
git rm --cached .env
git commit -m "chore: remove .env from tracking"GitHub のシークレットスキャンニングアラートを解除する
GitHub が自動検出してアラートを出している場合、履歴から削除してキーをローテーションした後で「Close alert」をクリックして対応済みにしてください。
Anthropic、AWS、GCP、Stripe、OpenAIなどの主要サービスのキー形式はパターンが登録されており、push した瞬間に検出されます。
私自身、壁紙アプリのバックエンドで使っていた Stripe のテストキーを誤ってコミットした時、GitHub からメールが来るより前に Stripe 側がキーの漏洩を検知してアラートを送ってきたことがあります。検知は本当に早いので、キーのローテーションは発覚後すぐが大切です。
再発防止のための仕組み
.env.example の運用
実際のキーが入った .env はリポジトリに含めず、キー名だけを書いた .env.example をコミットしておく方法が定番です。
# .env.example(コミットする)
ANTHROPIC_API_KEY=your_api_key_here
STRIPE_SECRET_KEY=your_stripe_key_here
ADMOB_APP_ID=your_admob_id_here
# .env(コミットしない)
ANTHROPIC_API_KEY=sk-ant-api03-xxxxx
STRIPE_SECRET_KEY=sk_live_xxxxx
ADMOB_APP_ID=ca-app-pub-xxxxxpre-commit フックでチェックする
Claude Code の hooks 機能を使ったり、シンプルな git pre-commit フックを書いたりして、コミット前に検知できます。
# .git/hooks/pre-commit に書く(実行権限が必要: chmod +x)
#!/bin/bash
if git diff --cached --name-only | grep -q "^\.env$"; then
echo "❌ .envファイルがコミットに含まれています。git rm --cached .envを実行してください。"
exit 1
fiこのフックがあれば、誤って git add .env をしてしまった時にコミット時点で止められます。
Claude Code に CLAUDE.md で伝える
プロジェクトの CLAUDE.md に以下を明記しておくと、Claude Code が .env を扱う際に適切に判断してくれます。
## セキュリティ上の注意
- `.env` ファイルは絶対に git に追加しないこと
- API キーやシークレットは環境変数またはシークレット管理ツール経由で渡すこと
- `git add .` でステージングする前に、`.env` が含まれていないことを確認する発覚した直後は焦りますが、キーのローテーション → 履歴の削除 → .gitignore 設定という順で進めれば、ほとんどの場合は手戻りなく対処できます。
まず最初に取るべき行動は「キーをローテーションすること」です。履歴の書き換えはその次で構いません。焦って git 操作を先にしてしまうと、その間も古いキーが有効なままになります。
同じ失敗を経験した方の参考になれば幸いです。