🔑

GitHubのコミットメールアドレスをプライベートにして、GPG鍵でコミットを署名して、過去のコミットをすべて上書きする

に公開

GitHubのコミットメールアドレスをプライベートにする

GitHubでは、コミット時に使用するメールアドレスを公開したくない場合、プライベートメールアドレスを使用できます。

GitHubの設定を変更する

  1. GitHubのメール設定ページにアクセスする
  2. 「Keep my email addresses private」にチェックを入れる
  3. 「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を中止できます。

参考文献

GitHubで編集を提案

Discussion