間違って公開してはいけないファイルをGitHubにアップしてしまったら

タイトルのような事故、油断するとやってしまいがちです。ライセンスキーやトークンを含むファイルはGitHubにアップしてしまうと、瞬く間にその情報を悪用され、場合によっては金銭的な損害や情報漏えいを引き起こしてしまいます。

このような事態を防ぐためにgit-secretsを導入して予防的措置を取るのですが、何かしらの事情でgit-secrets未導入で事故を起こしてしまった場合、gitの機能で復旧にむけて迅速な対応が可能です。

まずはコミットログ含めてファイルを削除します。

$ git filter-branch --tree-filter "rm -f [消したいファイルパス]" HEAD

こちらのような結果になったらOK!

Rewrite xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx (46/48) (6 seconds passed, remaining 0 predicted)    
Ref 'refs/heads/master' was rewritten

リポジトリに残骸が残っている可能性があるので、以下も実行。

$ git gc --aggressive --prune=now

このような結果になります。

Enumerating objects: 449, done.
Counting objects: 100% (449/449), done.
Delta compression using up to 4 threads
Compressing objects: 100% (417/417), done.
Writing objects: 100% (449/449), done.
Total 449 (delta 211), reused 184 (delta 0)

最後に強制的にGitHubにプッシュして終わり!

$ git push -f

このような結果になります。

Enumerating objects: 321, done.
Counting objects: 100% (298/298), done.
Delta compression using up to 4 threads
Compressing objects: 100% (138/138), done.
Writing objects: 100% (271/271), 259.08 KiB | 21.59 MiB/s, done.
Total 271 (delta 139), reused 247 (delta 117)
remote: Resolving deltas: 100% (139/139), completed with 12 local objects.
To https://github.com/bassbone/xxxx.git
 + 7a7a78d...ae20754 master -> master (forced update)

念の為GitHub上のリポジトリを確認して、削除したいファイルが削除されれば対応完了です。

今回紹介した方法はあくまでも緊急対応ですので、そもそもこのような事態にならないよう予防的措置は忘れずにしましょう!