トラブルシューティング

機密ファイルを誤ってコミットしたときの対処法

.env やパスワードファイルを誤ってコミットした場合の対処と予防策

機密ファイルを誤ってコミットしたときの対処法 diagram

追跡を解除してコミットし直す

  1. git rm --cached で追跡を解除

    git rm --cached .env のようにファイル名を指定します。ファイル自体はワーキングツリーに残ります。

  2. .gitignore にファイルを追加

    同じファイルが再度コミットされないよう、必ず .gitignore に記載します。

  3. 変更をコミット

    git add .gitignore と削除分を含めてコミットします。これで今後このファイルは追跡されません。

bash
# 追跡を解除(ファイルは残る)
git rm --cached .env

# .gitignore に追加
echo ".env" >> .gitignore

# コミット
git add .gitignore
git commit -m "機密ファイルを追跡対象から除外"

直前のコミットを修正する(未 push の場合)

  1. git reset HEAD~1 で 1 つ戻す

    直前のコミットを取り消します。変更はワーキングツリーに残るため、ファイルの中身は失われません。

  2. .gitignore にファイルを追加

    機密ファイルを無視するよう記述します。

  3. 再コミット

    git add で必要なファイルだけをステージングし、機密ファイルを含めずにコミットし直します。

bash
# 直前のコミットを取り消し(変更はワーキングツリーに残る)
git reset HEAD~1

# .gitignore に追加してから再コミット
echo ".env" >> .gitignore
git add . 
git commit -m "機密ファイルを除外して再コミット"

履歴からも完全に削除する(push 済みの場合)

  1. 漏洩した認証情報を即座にローテーション

    まず最優先で、漏れたトークンやパスワードを無効化して再発行します。履歴の削除より先に必ず実施してください。

  2. git filter-repo または BFG Repo-Cleaner で履歴から除去

    git filter-repo --path .env --invert-paths のように指定して、過去コミットからファイルを抹消します。BFG は bfg --delete-files .env が簡単です。

  3. force push でリモートを更新

    履歴を書き換えたので git push --force-with-lease でリモートに反映します。

  4. チームメンバーに周知

    履歴書き換えは共有ブランチに大きな影響を与えるため、必ずチーム全員に連絡し、各自で再クローンまたは fetch + reset を行ってもらいます。

bash
# git filter-repo を使う場合
git filter-repo --path .env --invert-paths

# BFG を使う場合
bfg --delete-files .env
git reflog expire --expire=now --all
git gc --prune=now --aggressive

予防策: .gitignore を最初に設定する

  • プロジェクト開始時に .gitignore を設定

    最も効果的な予防策です。github.com/github/gitignore のテンプレートを流用すると抜け漏れを減らせます。

  • git add . の前に git status で確認

    これから追加されるファイルを毎回確認する習慣をつけると、意図しないファイルの混入を早期に発見できます。

  • secret scanning を有効化

    GitHub の secret scanning(Push protection)を有効にしておくと、トークン等を push する前に Git がブロックしてくれます。

関連コマンド