LoginSignup
241
235

More than 1 year has passed since last update.

githubに間違って機密データを上げてしまった時の対処

Last updated at Posted at 2021-07-05

 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上に残っているキャッシュを削除してもらう必要があります。
 今回はプルリクもなかったので不要になりました。

終わった後の注意点

 この処理が終わったら古いローカルリポジトリをプッシュしないようにしましょう。またログが復元されてしまいます(うっかり、自分はこれやってしまったのでもう一度同じ手順を繰り返す羽目になりました……)。

参考リンク

241
235
2

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
241
235