GitHubにAPIのキーが書かれたファイルを上げてしまったので、対処の流れを書き残しておきます。
BFGを使用する方法とfilter-branchを使用する方法があるのですが、今回は後者をやってみました。
注意
外部にキーやパスワードなどを公開してしまった事に気づいたら、まずは対象のサービスを停止させて再発行を行ってください。その後、履歴を確認し悪用された形跡が残っていないか確認してから以下の手続きを行ってください。
対処するときプルリクがあるかどうかを確認して、ある場合にはすべてマージもしくはクローズしてから行うのを推奨しています。
自分のケースでは幸い1件もなかったので、そのまま行っています。
手順
1. ローカルにリポジトリをクローンする
$ git clone https://github.com/dynamonda/testproject.git
クローンしたら移動
$ cd testproject
2. 次のコマンドを削除したいファイルに対して実行する
ファイル名ではなく相対ファイルパスで指定します。
複数のファイルがある場合は、それぞれに対して実行する必要があります。
src/secret/apikey.txt
に対して実行する例
$ git filter-branch --force --index-filter "git rm --cached --ignore-unmatch src/secret/apikey.txt" --prune-empty --tag-name-filter cat -- --all
実行するとコミットログがズラーっと表示されていきます。警告が多分出ますが無視しましょう。rm 対象のファイル
が出ていればコミットログからの削除が完了しました。
...
...
Rewrite 88955747162f19fd9ccf08bfc82893990477dc63 (23/36) (2 seconds passed, rema
Rewrite 6e226e4b0891c245030a4e0c3fb1056bda704cc8 (23/36) (2 seconds passed, rema
Rewrite 7bf559a14c6038a94b29b4e331409c47e33d2aec (35/36) (3 seconds passed, rema
Rewrite 5ad76f9f42b7dc110112973e78a736abc1481c54 (35/36) (3 seconds passed, remaining 0 predicted)
rm 'src/secret/apikey.txt'
Ref 'refs/heads/master' was rewritten
Ref 'refs/remotes/origin/master' was rewritten
WARNING: Ref 'refs/remotes/origin/master' is unchanged
3. .gitignoreに追加する
コミットログから削除したファイルがまたコミットされないように、.gitignore
に追加しておきます。
$ echo "src/secret/apikey.txt" >> .gitignore
$ git add .gitignore
$ git commit -m "Add apikey.txt to .gitignore"
4. 変更をプッシュする
$ git push origin --force --all
4-1. 403エラーが出た場合
ここで403エラーが出てしまったので、合わせて対処しました。
remote: Permission to dynamonda/testproject.git denied to
fatal: unable to access 'https://github.com/dynamonda/testproject.git/': The requested URL returned error: 403
別PCで作業していたので、gitの設定もれだったようです。
$ git config --global user.name "dynamonda"
$ git config --global user.email <メールアドレス>
ユーザー情報を設定して、https://<ユーザ名>@github.com/<ユーザ名>/<リポジトリ名>.git
の形でorigin
に登録します。
$ git remote set-url origin https://dynamonda@github.com/dynamonda/testproject.git
再度プッシュします。
$ git push origin --force --all
パスワード入力を求められるので入力してプッシュ成功しました。
5. タグつきリリースがある場合には、以下もプッシュする
$ git push origin --force --tags
念の為
プルリクなどがあった場合には、GitHub Supportに連絡して、GitHub上に残っているキャッシュを削除してもらう必要があります。
今回はプルリクもなかったので不要になりました。
終わった後の注意点
この処理が終わったら古いローカルリポジトリをプッシュしないようにしましょう。またログが復元されてしまいます(うっかり、自分はこれやってしまったのでもう一度同じ手順を繰り返す羽目になりました……)。