🐷

OSSを公開するとメールアドレスがバレる

に公開3

先日こんなメールが来まして。

Hey 0si43,

I found your email from a recent commit to 0si43/shetommy.com on GitHub — hope that’s okay.
I’m a dev too, and built xxx, an AI agent that drafts PRs from issues (works great with Next.js).

(意訳)
Hey! GitHubのshetommy.comというリポジトリの直近のコミットからこのメールアドレスを見つけました。許してもらえると嬉しいです
私も開発者なんですよ!issueからPRのドラフトをつくるAIエージェントを開発しています!(Next.jsとの相性も最高)

(製品名は宣伝になるので潰してます)

確認したところ、確かにやろうと思えばメールアドレスが見れる状態でした。
なので見れないように対応したので、その手順をまとめます。

ハイリスク・緊急対応必要というよりかは、中リスク・まあまあめんどくさい対応という感じでした。

なぜ見れるのか

  • Gitのコミット時にCommiterとAuthorが記録される
  • Gitの設定で普段使いのメールアドレスを指定していた場合(not GitHub)、リポジトリに残ってしまう
  • GitHub上だと見えないけど、git cloneしてコマンド打ったら見える
  • プライベートリポジトリ or GitHub用アドレス使ってたら問題なし
  • 普段使いだったとしても、リテラシー高めのスパム業者や私怨ぐらいしかたどりつかない
    • たどりついたとしてもメールアドレスだけでできることは限界がある
    • スパムの標的になってもGmailの拒否設定とかありますし
    • 私怨の人は別にメールアドレスぐらいは何らかの方法で取れるし

設定変更

できることが限られてるので「気にしない」というのもアリだったんですが、今後を考えて書き換えることにしました。
まず今Gitで設定しているメールアドレスを確認します。

git config --global user.email

これが個人アドレスになっている方は、GitHubが提供している秘匿アドレスに書き換えるのがいいと思います。

git config --global user.email "xxx@users.noreply.github.com"

GitHubのnoreplyまでの導線はこちらの記事を参照してください。

https://zenn.dev/kazzyfrog/articles/1c45a3672a1e95

この設定によって今後のコミットはxxx@users.noreply.github.comが適用されます。
が、過去にやらかして、プライベートアドレスでコミットした履歴は消えません。

過去のコミットの書き換え

既にpublicリポジトリにコミット済みの履歴を改変したい場合、Gitの歴史を改変するしかありません。
共同開発しているリポジトリであれば、他の人に影響が出ます。
これは避けられません。

改変の流れとしては、ローカルにmainブランチを持ってきて、
mainのコミット履歴の中にある自分のメールアドレスが入ったコミットを全部書き換えて、フォースプッシュするという荒技をします。
チーム開発ではまずできません。

まずgit cloneで当該リポジトリをローカルに持ってきます。

git log --author="old-email@example.com"

このコマンドで、コミットに残っている自分のメールアドレスを確認します。
これを全て書き換えます。

git filter-branch -f --env-filter "GIT_AUTHOR_NAME='xxx'; GIT_AUTHOR_EMAIL='xxx@users.noreply.github.com'; GIT_COMMITTER_NAME='xxx'; GIT_COMMITTER_EMAIL='xxx@users.noreply.github.com';" HEAD

このコマンドのユーザーidとメールアドレスを書き換えてください。
このコマンドを打つと、一瞬怖いワーニングメッセージが出ます。

WARNING: git-filter-branch has a glut of gotchas generating mangled history
	 rewrites.  Hit Ctrl-C before proceeding to abort, then use an
	 alternative filtering tool such as 'git filter-repo'
	 (https://github.com/newren/git-filter-repo/) instead.  See the
	 filter-branch manual page for more details; to squelch this warning,
	 set FILTER_BRANCH_SQUELCH_WARNING=1.

待ってると勝手に実行されます。
コマンド終了後、もう一度確認します。

git log --author="old-email@example.com"

出力されなかったら書き換え成功です。
フォースプッシュします。

git push -f origin main

なお非常に危ない作業で、最悪復旧できなくなるので、細心の注意を払ってください。

フォーク先は諦めるしかなし

リポジトリがフォークされていた場合、そちらのリポジトリにはメールアドレスは残ります。

まとめ

以上、コミット履歴のメールアドレス設定の変更について書きました。
パブリックにコード公開するのであれば、早めに設定入れておきたいですね。
(それかメールアドレス自体を流出してもいいやつ使うか)

(了)

Discussion

にゃんだーすわんにゃんだーすわん

GitHubの画面上で見えないので一見隠れていそうに見えますが、git cloneしてlogを見ればわかるのもそうですし、ブラウザからでもPull Requestとかコミットのページの末尾に.patchと付ければ確認できるので秘匿性はまったくありません。

スパムメールや営業メールなどは稀にとどきますが、ほとんどGmailでフィルタされているのであまり気にする必要はないかなと思っています。

蔀

Pull Requestとかコミットのページの末尾に.patchと付ければ確認できる

これ知らなかったです。
この記事の手順やってもPull Requestの.patch情報書き変わってないですね。。。

あいや - aiya000あいや - aiya000

$ git config --local user.email foo@example.comで、そのリポジトリ専用のメールアドレスを明示したりもできます
(user.nameもある)

あとはgit hooksのpre-commitで、localのuser.emailが設定されているかを調べ、設定されていなければ弾く、ということができます!
これでglobalのuser.emailを使うことを避けられます
https://github.com/aiya000/dotfiles/blob/main/.git_templates/hooks/pre-commit

僕はそれを設定して、↓のようなものをgit-clone後に実行することで、誤りを防止してます
https://github.com/aiya000/dotfiles/blob/main/.sh_generic/aliases.sh#L299