GithubでGPG認証エラーが発生したら
GitHubでのGPG
このページにたどり着いた人はすでに知っていると思いますが、gitではGPG(Gnu Private Guard)を用いて、commitやtagにsignすることができます。GitHubでは、このsignを用いて認証を行い、認証が成功したものに関しては、verifiedというマークを付与します。
自分の勤務先では複数のレポジトリでverifiedなcommit以外を受け付けないルールが設定されており、これを解消するためにしたことをメモとして残しておきたいと思います。
GPGキーの生成
Githubで作成方法が紹介されていますが一応手順を乗せておきます
- 以前にGPGキー作成している可能性もありますので、既存のgpgキーの所在を確認しておきますもし何も表示されなけれキーがないので以下の手順でキー生成を、もしキーが存在すればGithubに登録まで飛んでもらって構いません。そもそもgpgコマンドがインストールされていなかった場合は、こちらからバイナリをインストールして下さい。
gpg --list-keys --keyid-format short
- キーの生成
gpg --full-generate-key
- 生成キーの確認
gpg --list-keys --keyid-format short #pub rsa4096/ABCDE123 2024-09-22 [SC] [expires: 2025-09-22] # 8E579C1xxxxxxxxxxxxxx #uid [ultimate] Hoge Fuga <example@example.com> #sub rsa4096/FGHD45678 2024-09-22 [E] [expires: 2025-09-22] #sub rsa2048/IJK901234 2024-09-22 [S] [expires: 2025-09-22]
Githubに登録
GihubにはGPGキーの中身を登録する必要があります。すでに存在していた、あるいは新たに作成したGPGキーの中身を見るには、pubkeyのIDを使用して以下のようなコマンドを実行します(IDをABCDE123としています)
gpg --armor --export ABCDE123
実行結果をコピーしてGithubのAccount > Settings > SSH and GPG keys URL: https://github.com/settings/keys にある GPG keysに登録する必要があります。
このとき、GitHubに登録されているメールアドレスに鍵の生成時に入力したメールアドレスが含まれている必要があります。
メールアドレスが異なる場合 > GPGキーのメールアドレス変更方法
コマンドラインで以下のコマンドを実行してGPGキーのリストを表示します。
gpg --list-keys
ここで改めて自分が持っているGPGキーのIDを確認してください。
次にGPGキーの情報を編集します。
gpg --edit-key <key_id>
adduid コマンドを使って新しいメールアドレスを追加します。プロンプトに従っ必要な情報を入力ます。
もし必要であれば、古いメールアドレスを削除することもできます。deluid コマンドを使用し、削除したいメールアドレスの番号を選びます。最後に変更を保存します。save コマンドを入力してください。
今後のCommitで自動的にGPGキーで認証されるように設定
git config --global commit.gpgsign true
すでにcommitした内容についてGPG認証付きコミットに更新したい場合
ブランチ内のすべてのコミットに対して署名を追加するために、インタラクティブリベースを使用します。以下のコマンドを実行しますが、HEAD~<n>
の部分には、リベース対象とするコミット数を指定してください。すべてのコミットをリベースするためには、HEAD~<n>
を一番古いコミットまで遡る形に変更します。例えば、ブランチに5つのコミットがある場合、HEAD~5
とします。
-
rebae
git rebase --interactive --exec 'git commit --amend --no-edit --gpg-sign' HEAD~<n>
例えば、ブランチ内に最新から過去に遡って5回のコミットがある場合:
git rebase --interactive --exec 'git commit --amend --no-edit --gpg-sign' HEAD~5
-
再コミット
上記コマンドを実行すると、エディタが開いてコミット履歴が表示されます。何も変更せずにそのまま保存して閉じます。Gitは指定されたスクリプトを使って各コミットを再署名します。 -
リモートリポジトリにプッシュ
署名の追加が完了したら、リモートリポジトリに強制プッシュする必要があります。git push --force-with-lease
Discussion