GitHubにホストされているGitからの個人情報流出を防ぐために

※2021/5/13 追記
git filter-repoコマンドを使用する方法を追記しました。



言いたいこと

GitHubとGitの設定によっては世界中の人々に意図せず個人情報を晒すことになるので、みなさまお気をつけください…🙇‍♂️💦


プロローグ

私の元に1通のメールが届きました。内容は以下のようなものです。

tkhs0604様

突然のご連絡申し訳ございません。株式会社xxxx人事のxxxxと申します。
GitHubのコミットログにメールアドレスが記載されておりましたので、不躾ながらご連絡させて頂きました。


このような採用に関するメールをいただくこと自体は珍しいことではないので、最初は特に疑問に思うこともなくいただいた情報を純粋に見ていたのですが、改めて本文を見返すと、

GitHubのコミットログにメールアドレスが記載されておりましたので


え!コミットログから辿ったの!?

と、一瞬頭が混乱しました。
GitHub上からGitのコミットログの詳細情報は閲覧できないはずなので、人事の方がわざわざリポジトリをcloneしてコミットログを確認してまでご連絡くださったのかと感心する気持ちもありましたが、それに勝る恐怖感を抱きました…😨

ただ、これはこれでいい気付きをいただいたと思い、 GitHubとGitの設定を見直すことにしました。


コミットログに含まれる情報

GitHubのコミットログにメールアドレスが記載されておりましたので」とのことでしたので、コミットログを確認してみました。
Gitのコミットログは、ターミナルなどで対象リポジトリディレクトリに移動し、git logコマンドで確認できます。以下のような内容が表示されます。

$ git log
commit ca82a6dff817ec66f44342007202690a93763949
Author: Scott Chacon <schacon@gee-mail.com>
Date:   Mon Mar 17 21:52:11 2008 -0700

    changed the version number


上記の通り、コミットログには以下の情報が含まれています。

  • コミットのハッシュ値
  • (最初に)コミットしたユーザ名とメールアドレス
  • コミット日時
  • コミットメッセージ


確かにここに記載されたメールアドレス宛にメールが届いていました…😭


GitHubの設定確認

そこで、まずはGitHubの設定を確認しました。
GitHubのメールアドレスの設定は右上のアイコン横のプルダウンメニューからSettingsを選択し、遷移先のページのEmailsメニューから確認できます。

真ん中あたりのKeep my email addresses privateという項目にチェックを入れることで、以下のような設定になります。

  • remove your public profile email
  • use [id+username]@users.noreply.github.com when performing web-based Git operations (e.g. edits and merges) and sending email on your behalf
    ※上記の[id+username]はアカウント単位で発行されます。


この項目のチェック自体はきちんと入れていたのですが、見落としていた最後の1文が重要でした。

  • If you want command line Git operations to use your private email you must set your email in Git


このメールアドレスをPC側で設定していなかったため、メールをいただいたメールアドレスがコミットログに記載されてしまっていました。


Gitの設定確認

次にPC側のGitの設定を確認しました。
Gitのメールアドレスの設定はgit config --listコマンドで確認できます。

ややこしいことにGitの設定はsystem/global/localの3つの範囲に対して行うことが可能です。
私の場合、メールアドレスの設定はglobalにだけしていたので、以下のコマンドでuser.emailを更新しました。

$ git config --global user.email [id+username]@users.noreply.github.com


個人開発かつ複数のPCから操作する可能性がある場合は、localuser.nameuser.emailを設定しておくとよさそうです。
Gitの設定はsystem < global < localの優先順位で適用されるので、特定のリポジトリだけ対応するときはこの設定をしておけば基本的に問題ないと思います。

$ git config --local user.name [username]
$ git config --local user.email [id+username]@users.noreply.github.com


過去のコミットログの情報を書き換える

ここまでの対応で今後のコミットからのメールアドレス流出は回避できますが、依然として過去のコミットログからメールアドレスを取得できる状況です。
私の場合はコミッターが1人だったので、該当のプロジェクトディレクトリにて以下のコマンドを実行して一括更新しました。

$ git filter-branch --force --env-filter "GIT_AUTHOR_EMAIL='[id+username]@users.noreply.github.com'; GIT_COMMITTER_EMAIL='[id+username]@users.noreply.github.com';" --tag-name-filter cat -- --all



※2021/5/13 追記
git filter-branchコマンドは非推奨となり、現在はgit-filter-repoライブラリのコマンドの使用が推奨されているようです。
リポジトリのドキュメントを参考に、git-filter-repoのインストールを行った後、以下の手順で一括更新できそうです。

1. メールアドレスのマッピング用ファイル(以下、mailmapファイルと呼びます)を作成する

# ファイル名は任意です
$ touch mailmap

2. Gitの公式ドキュメントを参考に、1.で作成したmailmapファイルをVimなどで開き、以下のようにマッピング情報を追記する

# `<>`が必須なので注意してください
<[id+username]@users.noreply.github.com> <committed@email.address>

3. リポジトリのチートシートを参考に、該当のプロジェクトディレクトリにて以下のコマンドを実行する

# パスの指定は絶対パス、相対パスのどちらでも大丈夫です
$ git filter-repo --force --mailmap [mailmapファイルのパス]


最後に全ブランチ、タグの変更を強制pushすることで対応は完了になります。

$ git push --force origin --all


これで安心して個人開発が行えます。笑


参考