GitHub に API キーを間違ってコミットしてしまったら。
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
なお、削除したファイルはもう実体を取得できませんが、その記録(ファイルが存在したことがわかる)だけは残っています。この削除はもう少し複雑です。