GitHubのコミットメールアドレスをプライベートにして、GPG鍵でコミットを署名して、過去のコミットをすべて上書きする
GitHubのコミットメールアドレスをプライベートにする
GitHubでは、コミット時に使用するメールアドレスを公開したくない場合、プライベートメールアドレスを使用できます。
GitHubの設定を変更する
- GitHubのメール設定ページにアクセスする
- 「Keep my email addresses private」にチェックを入れる
- 「Block command line pushes that expose my email」にチェックを入れる(プライベートメールアドレス以外でのpushをブロックできる)
これにより、プライベートメールアドレスを取得できます。
形式は <ID>+<username>@users.noreply.github.com
です。
このアドレスは設定ページで確認できます。
We’ll remove your public profile email and use xxx+xxx@users.noreply.github.com when performing web-based Git operations ...
という部分からアドレスを確認できます。
Gitの設定を変更する
Gitでプライベートメールアドレスを使用するように設定します。
# グローバル設定として変更する場合
git config --global user.email "<ID>+<username>@users.noreply.github.com"
# 特定のリポジトリのみで変更する場合
git config user.email "<ID>+<username>@users.noreply.github.com"
設定が正しく反映されているか確認します。
git config user.email
GPG鍵でコミットを署名する
GPG鍵を使用してコミットに署名することで、そのコミットが本人によるものであることを証明できます。GitHubでは、署名されたコミットに「Verified」バッジが表示されます。
GPG鍵を生成する
GPG鍵がまだない場合は、新しく生成します。
# GPG鍵を生成
gpg --full-generate-key
gpgのインストールはよしなに行ってください。
私はNixユーザなので、nixpkgsからgnupg
をインストールしました。
対話形式で以下を選択・入力する。
- 鍵の種類:
ECC (sign and encrypt)
(デフォルト) - 楕円曲線暗号:
Curve 25519
(デフォルト) - 有効期限: 任意(デフォルトは無期限)
- Real name: GitHubのユーザ名
- Email address: 先程取得したGitHubのプライベートメールアドレス
すべてデフォルトならEnterキー連打で問題ないです。私は連打しました。
パスフレーズの設定
GPG鍵の生成時に、パスフレーズの入力を求められます。
パスフレーズは、GPG秘密鍵を保護するための重要な要素です。パスフレーズを設定することで、秘密鍵が漏洩した場合でも、第三者による不正使用を防げます。
パスフレーズを設定する際は、以下の点に注意してください。
- 十分な長さと複雑さを持つパスフレーズを使用する
- 推測されやすい単語や個人情報は避ける
- パスワードマネージャーを使用して安全に管理する
- パスフレーズを忘れると秘密鍵が使用できなくなるため、確実に保管する
パスフレーズは、コミットへの署名時に入力を求められます。入力の手間を減らしたい場合は、gpg-agent
を使用してパスフレーズをキャッシュできます。
GPG鍵IDを確認する
生成した鍵のIDを確認します。
gpg --list-secret-keys --keyid-format=long
出力例は以下の通り。
/Users/username/.gnupg/secring.gpg
----------------------------------
sec 4096R/3AA5C34371567BD2 2024-01-01 [expires: 2025-01-01]
uid Your Name <ID+username@users.noreply.github.com>
ssb 4096R/42B317FD4BA89E7A 2024-01-01
sec
の行の 3AA5C34371567BD2
が鍵IDです。
GPG鍵をGitHubに登録する
公開鍵をエクスポートします。
gpg --armor --export <鍵ID>
# macosの場合は以下で直接クリップボードにコピー可能
gpg --armor --export <鍵ID> | pbcopy
出力された公開鍵をコピーして、GitHubのGPG鍵設定ページに登録します。
公開鍵は -----BEGIN PGP PUBLIC KEY BLOCK-----
から -----END PGP PUBLIC KEY BLOCK-----
までの部分です。
Gitの設定を変更する
Gitで署名を有効にします。
# 使用するGPG鍵を指定
git config --global user.signingkey <鍵ID>
# すべてのコミットに署名する
git config --global commit.gpgsign true
過去のコミットをすべて上書きする
既存のコミットで使用しているメールアドレスをプライベートメールアドレスに変更し、GPG署名を追加する方法を説明します。
filter-branchを使用する方法
git filter-branch
を使用して、すべてのコミットの作成者情報を変更できます。
この操作はリポジトリ単位なので、各リポジトリで実行してください。
git filter-branch -f --commit-filter '
GIT_AUTHOR_EMAIL="<ID+username@users.noreply.github.com>";
GIT_COMMITTER_EMAIL="<ID+username@users.noreply.github.com>";
git commit-tree -S "$@";
' HEAD
リモートにpushする
変更をリモートリポジトリにpushします。
# 変更内容を確認
git log --show-signature
# force pushする(注意!)
git push --force-with-lease origin main
--force-with-lease
を使用することで、リモートに予期しない変更がある場合はpushを中止できます。
Discussion