GitHub に push しようとしたとき、以下のようなエラーが出て push が拒否されることがあります。
Push cannot contain secrets
多くの人がこう思います:
「もうファイルを削除したのに、なぜ push できないの?」
しかし実は、削除しても Git の過去コミットに秘密情報が残っている限り、GitHub は push を完全に拒否します。
これが問題の本質です。
❗ なぜ「ファイルを削除したのに push できない」のか?
Git でファイルを削除しても、それは 「最新のコミットから削除しただけ」 です。
しかし過去のコミットにはこう残っています:
serviceAccount.json(秘密鍵)が含まれている
過去の履歴として、永遠に保存されている
GitHub の Push Protection 機能は以下をチェックします:
最新のファイルだけではなく、すべての過去コミットに秘密情報がないか
つまり、
❌ 最新コミットで削除しても意味がない
❌ --force push しても意味がない
❌ .gitignore に追加しても意味がない
過去コミットに残っている限り push は絶対に許可されません。
🔍 GitHub のエラーが示す通り「問題は過去コミット」
これは
「このコミットに秘密鍵が残っているから push できないよ」
という意味です。
🔧 ではどうすればいいのか?
👉 過去のコミットから “完全に削除” するしかありません
GitHub の Push Protection を通過するには、
Git の歴史そのものを書き換えて問題のファイルをまるごと消す必要があります。
✅ 解決手順(履歴から完全に削除する方法)
-
.gitignore に追加(再発防止)
echo "server/src/keys/serviceAccount.json" >> .gitignore -
最新コミットから削除(表面上の削除)
git rm --cached server/src/keys/serviceAccount.json
git commit -m "Remove serviceAccount.json" -
過去コミットからも完全削除(これが本丸)
推奨:git-filter-repo を使う方法(最新・安全)
① インストール(macOS)
brew install git-filter-repo
② 過去すべての履歴からファイルを除去
git filter-repo --path server/src/keys/serviceAccount.json --invert-paths
これで そのファイルが存在した全ての歴史から削除されます。
- GitHub へ push
git push origin main --force
履歴の中に秘密鍵が残っていなければ、Push Protection に通過します。
🔐 5. 秘密鍵は必ず再発行する
一度でもコミットした秘密鍵は「漏洩したもの」として扱わなければなりません。
🎯 まとめ(この記事の主旨)
この記事で最も伝えたいことはこれです👇
💡 **ファイルを削除しても push できないのは、
過去のコミットに秘密情報が“残ったまま”だから。**
そして、解決方法は次の通り:
最新コミットで削除するだけでは不十分
.gitignore は過去の履歴を消してくれない
--force でも履歴に残っていると push は拒否される
git-filter-repo で過去の履歴ごと削除する必要がある