◉CLAUDE LABEN
●2.1.301 — vim の % モーション、VS Code パネルでの LaTeX 数式表示、使用量上限待ちのリトライ監視の上限が入りました(10/15)●2.1.299 — 200K トークン超で約54分放置した会話はアイドル圧縮。MCP の許可ルールは名指ししたサーバーだけに一致します●SONNET 4.5 — Claude API での提供終了は 11/30、残り45日。移行先は Sonnet 5.5●WINDOWS — 日本語の環境でだけフックが黙って壊れる報告があり、文字コードの確認が呼びかけられています●FAST MODE — Opus 5.5 の Fast mode がリサーチプレビューを終え、ベータヘッダーが不要になりました(10/15)●NEW — Cowork に渡したフォルダの先頭に、十行の約束ファイルを置いてみました●2.1.301 — vim の % モーション、VS Code パネルでの LaTeX 数式表示、使用量上限待ちのリトライ監視の上限が入りました(10/15)●2.1.299 — 200K トークン超で約54分放置した会話はアイドル圧縮。MCP の許可ルールは名指ししたサーバーだけに一致します●SONNET 4.5 — Claude API での提供終了は 11/30、残り45日。移行先は Sonnet 5.5●WINDOWS — 日本語の環境でだけフックが黙って壊れる報告があり、文字コードの確認が呼びかけられています●FAST MODE — Opus 5.5 の Fast mode がリサーチプレビューを終え、ベータヘッダーが不要になりました(10/15)●NEW — Cowork に渡したフォルダの先頭に、十行の約束ファイルを置いてみました
記事一覧/Claude Code
⟐ Claude Code/2026-05-12中級

APIキーを誤って git commit してしまった時の緊急対応手順 — Claude Code を使った履歴削除とキーローテーション

.envのAPIキーを誤ってgit commitしてしまったときの緊急対応手順です。最初の5分で行うキーのローテーション、被害範囲の確認、git履歴からの完全削除、GitHubのシークレットスキャンニングアラートの解除、.gitignore整備を含む再発防止までClaude Codeを使って実践的に解説します。

troubleshooting61security10git18envapi-keyclaude-code132emergency

「まずい、.env をそのまま commit してしまった」——気づいた瞬間、手が止まる経験をされた方は多いのではないでしょうか。

2014年から個人でアプリを開発し続けてきた私にとって、これは他人事ではありません。AdMob のキー、Stripe の本番キー、Anthropic の API キー。複数のサービスを組み合わせて動かす個人プロダクトでは、.env ファイルの管理が少しでも緩むと、一瞬で全ての認証情報が公開リポジトリに乗ってしまうリスクがあります。

ここではすでにコミットしてしまった後に取るべき手順を、時間順に整理してお伝えします。発覚から30分以内に全て完了できるよう、各ステップを具体的にまとめました。

最初の5分でやること — キーのローテーション

履歴の書き換えより先に、必ずこちらを済ませてください。git の歴史を消しても、コミットしていた間に誰かがキーをコピーしていた可能性はゼロではありません。

Anthropic API キーを漏洩した場合:

  1. console.anthropic.com にログイン
  2. 「API Keys」→ 該当キーを「Revoke」
  3. 新しいキーを発行してローカルの .env を更新

Google AdMob / Firebase キーを漏洩した場合:

  1. console.firebase.google.com → プロジェクト設定 → 「サービスアカウント」または「APIキー」
  2. 該当キーを無効化し、新しいキーを発行

Stripe キーを漏洩した場合:

  1. dashboard.stripe.com → Developers → API keys
  2. 本番キーは「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 --all

Claude 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-xxxxx

pre-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 操作を先にしてしまうと、その間も古いキーが有効なままになります。

同じ失敗を経験した方の参考になれば幸いです。

シェア

お読みいただきありがとうございます

Claude Lab は広告なしで運営しており、サーバー費用などの運営コストはメンバーシップのご支援で賄っています。実装コード・ベンチマーク・本番設計パターンなど、実務でお役立ていただける記事を毎日更新しています。もし読んでよかったと感じていただけましたら、ぜひご覧ください。

  • ✦コピー&ペーストで使える実装コード付き
  • ✦毎日新しい上級ガイドを追加
  • ✦¥580/月 または ¥1,480 の永久アクセス
メンバーシップを見る →

もしこの記事がお役に立ちましたら、チップ(¥150)で応援いただけると大変励みになります。広告なしでの運営を続けるため、皆さまのご支援が大きな力になっています。

関連記事

⟐ Claude Code2026-08-28
名前に混ざった見えない文字を、プラグインを入れる前に洗い出す小さなスクリプト
プラグインやスキルの名前に不可視文字や制御文字が混ざっていても、ターミナルの一覧では見分けがつきません。実際に6つの紛らわしい名前を並べて ls の出力を比べ、導入前に走らせる点検スクリプトと、その点検が拾えない範囲までを整理しました。
⟐ Claude Code2026-05-24
Claude Code で連続する Edit が連鎖的に失敗するときの直し方 — old_string が消える・重複する問題
Claude Code が同じファイルへ Edit を連続で投げると、2件目以降が突然『not found』や『not unique』で落ちることがあります。原因は順序依存とコンテキスト二重化で、Read 再実行と分割パッチで救えます。
⟐ Claude Code2026-05-10
Claude Code の Glob と Grep が0件を返すときの原因切り分け
Claude Code の Glob/Grep ツールがファイルを見つけられないとき、.gitignore除外・隠しファイル・パターン記法の落とし穴を切り分け、適切な代替手段で確実に発見する手順をまとめます。