GitHubに間違えてパスワードをコミットしてしまったのでhistoryを削除しました。今回はキャッシュの完全削除までの手順をまとめます。
git filter-branchまたはthe BFG Repo-Cleaner(オープンソースツール)どちらかを使用して自分でhistoryを削除した後、GitHubのサポートに連絡してcached viewを削除してもらえば完全に個人情報やパスワードを削除することができる、というのがおおまかな手順です。
詳しくご紹介したいと思います。
最新のコミットの削除は比較的簡単
最新のコミットで個人情報などをGitHubにあげてしまった場合はGitからのコマンドは比較的簡単で、git rmを使います。
詳しくはこちら⇒Removing files from a repository's history
随分前にコミットしたファイルのヒストリーの削除には git filter-branchコマンドを使用する(またはオープンソースのthe BFG Repo-Cleanerを使う)
私の場合は、随分前にコミットしたファイルのヒストリーを削除する必要がありました。しかも、ファイル自体は一度GitHub上で削除してしまっており、historyにだけ個人情報とパスワードが残っていて、historyを見ると丸見えの状態でした。
今回、GitHubのサポートにメールすると、手順が書かれたURLが添付されて返信が届きました。以下のURLの手順に従って自分でhistoryを削除する必要がある、とのことでした。その後、historyの削除が完了したことをGitHubに返信(メール)すれば、GitHub側でcached viewを削除する、という流れです。
⇒Removing sensitive data from a repository
上記URLによると、GitHubのレポジトリのhistoryを削除するには2つ方法があります。
①Git Bashからgit filter-branchコマンドを使う
②オープンソースのBFG Repo-Cleanerを使う
今回はURLの手順に目を通して、git filter-branchコマンドを使うことにしました。実際にhistoryを削除できたgitコマンドの手順は以下のとおりです。
①レポジトリのコピーをとるため、ローカルのパソコン上にクローン(clone)する(まだ行っていない場合のみ)
$ git clone https://github.com/YOUR-USERNAME/YOUR-REPOSITORY
YOUR-USERNAMEには自分のGitHubのユーザーネームを、YOUR-REPOSITORYにはターゲットとなるGitHub上のレポジトリ名を入力します。
②レポジトリ上に移動する
$ cd YOUR-REPOSITORY
③git filter-branchコマンドを使用してhistoryを削除する
$ git filter-branch --force --index-filter "git rm --cached --ignore-unmatch PATH-TO-YOUR-FILE-WITH-SENSITIVE-DATA" --prune-empty --tag-name-filter cat -- --all
今回はconfig/default.jsonを削除する必要がありましたので、PATH-TO-YOUR-FILE-WITH-SENSITIVE-DATAの部分にconfig/default.jsonを当てはめてコマンドを書きました。
$ git filter-branch --force --index-filter "git rm --cached --ignore-unmatch config/default.json" --prune-empty --tag-name-filter cat -- --all
この場合のポイントはファイル名だけを入力するのではなく、ファイルへのパスを入力する必要があるということです。
また、ファイル名を変更したり別の場所へ移動している場合は、元のパスでも上記のコマンドを実行する必要があります。もし、ファイルの名前や場所を変更している場合は忘れないように実行しておく必要があります。
④ これ以上の間違いを防ぐために .gitignoreにファイルを追加しておく
これ以上間違えて個人情報やパスワードをGitHubにコミットすることを避けるために、.gitignoreにファイルを追加しておきます。(既に行っている場合は不要)
$ echo "YOUR-FILE-WITH-SENSITIVE-DATA" >> .gitignore $ git add .gitignore $ git commit -m "Add YOUR-FILE-WITH-SENSITIVE-DATA to .gitignore"
⑤ GitHubのレポジトリのhistoryを確認して、個人情報やパスワードなどが消去されているか確認する
GitHubのレポジトリのhistoryを確認して、個人情報やパスワードなどが消去されているか確認したところ、コミットしたhistory自体が削除されていました。今回はconfig/default.jsonに行った3つのコミットのhistoryを削除したかったのですが、全て無事削除されていました。
⑥force-pushを使ってローカルでの変更をGitHubのレポジトリに上書きする
historyの削除までで納得できていたのですが、手順通りにforce-pushを行いました。
$git push origin --force --all
その他、tagged releasesから個人情報やパスワードを削除したい場合は、以下のコマンドで行うそうです(今回は関係なかったので行いませんでした。)
$ git push origin --force --tags
⑦GitHubのサポートに連絡してキャッシュ(cached view)を削除してもらう
historyの削除までは自分で行うことができるのですが、キャッシュが残ってしまいます。残念ながら、キャッシュは自分で削除することができません。
キャッシュ(cached view)の削除はGitHubのサポート担当者が手動で行うとのことで、GitHubサポートにメールしました。
私がGitHubサポートにメールで伝えた内容は、commit ID・ターゲットとなるレポジトリのURL・sensitive dataを含んだhistoryのcached view(キャッシュ)を削除してほしい、という3点です。
(もし、同じレポジトリで他にも作業している人がいる場合にはrebaseするように伝えます。詳しくはRemoving sensitive data from a repositoryのUsing filter-branchの9番と10番参照)
★今回は、担当者にメールして3時間ほどで返信が返ってきました。「キャッシュを全て削除しておいたので、他にもできることがあればまた連絡してほしい」とのことでした。解決できて良かったです!
まとめと感想
GitHubに間違えてパスワードや個人情報を載せてしまうことは、あり得る間違いなので、対処方法を知ることができて良かったです。
GitHubのページ上ではhistoryを削除することができないのが不便な気もしましたが、Gitのコマンドがわかれば自分でhistoryを削除できることがわかって安心しました。
さらなる間違いを防ぐためにも、パスワードや個人情報を含んでいるファイルは早目に .gitignoreに追加しておいたり、git add .などのコマンドを使わないことも大切だと思いました。間違いに気づいたらすぐにパスワードやユーザーネームなどの個人情報を変更しておくことも大切ですね。
また、GitHubの場合サポートに連絡できる体制があるのもありがたいと思います。
今回のような間違いの場合、historyをGitコマンドで削除した後、キャッシュを手動で削除してもらう必要があるので、GitHubサポート担当者に連絡して削除作業してもらうのに少々時間がかかるというのも覚えておきたいポイントだと思います。