sh1’s diary

プログラミング、読んだ本、資格試験、ゲームとか私を記録するところ

GitHub に間違って API キーをコミットしてしまったときの対応

GitHubAPI キーを間違ってコミットしてしまったら。

Git (GitHub) はコードを遡って調べることができる反面、API キーのような情報を修正しようとすると、遡って記録を訂正しなければいけません。思ったよりも面倒な手順で、今のところボタン一つで解決……とはいきません。

問題の記録を確認する

まず、削除したい情報を確認します。

git log --all --name-status --pretty=short --graph -- 削除するファイル/ディレクトリパス

このとき、コミット ID を取得することが可能です。これは重要な情報なので、メモします。あとで、コミット ID を checkout してコミット履歴が復元できるかどうかをチェックしましょう。

git checkout コミットID

対応方法

コマンドを使って対応を進めるので、Git Bash でも Visual Studio Code でもいいので、すぐにコマンドを打てる環境を構築しておくようにしましょう。Visual Studio で普段の commit 等の操作をしていると、Git とフレンドリーな CUI 環境を構築し忘れていたりします。注意。

git filter-branch --force --index-filter 'git rm --cached --ignore-unmatch 削除するファイル' HEAD
git filter-branch --force --index-filter 'git rm -rf --cached --ignore-unmatch 削除するディレクトリーパス' HEAD
or
git filter-branch --force --tree-filter 'rm --cached --ignore-unmatch 削除するファイル/ディレクトリパス' HEAD
git filter-branch --force --tree-filter 'rm -rf --cached --ignore-unmatch 削除するファイル/ディレクトリパス' HEAD

filter-branch の命令で Git に記録している情報の歴史を書き換えます。

書き換えのオプションが --index-filter です。--tree-filter という似ているオプションもあります。index-filter はローカルリポジトリの index 上で書き換えて、tree-filter はローカルリポジトリのファイルを working tree に checkout してから書き換えます。

反映

filter-branch のコマンドは GitHub上のデータを直接編集するわけではないので、最後に push が必要です。

git push --all --force origin

// 問題がないことを確認して後日実行
git reflog expire --expire-unreachable=now --all
git gc --prune=now

なお、削除したファイルはもう実体を取得できませんが、その記録(ファイルが存在したことがわかる)だけは残っています。この削除はもう少し複雑です。

参考