※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から操作する可能性がある場合は、local
にuser.name
とuser.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
これで安心して個人開発が行えます。笑