🎃

gitでGPG署名付きコミットを忘れた時

2021/10/17に公開

背景

私は可能な限り開発状況においてコミットはGPG署名付きにて行っていますが、自分の新しいPC環境やリモートサーバーで直接開発を行いコミットをする際に、GPGの設定をするのを忘れていたりすると開発の手が止まってしまい、非常に嫌な思いをします。

そこで今回はそんな時に、後からでも署名を追加できるコミットの編集方法を紹介します。

TL;DR

  1. git rebase -i {ターゲットの一つ手前のコミットID}
  2. エディタが立ち上がり、1で指定したコミットIDまでの履歴が一覧として立ち上がるので、GPG署名を追加したいターゲットのコミット(もしくは複数)のコマンドをpickからeditへと変更し、保存する
  3. git commit --amend --no-edit -S
  4. git rebase --continue

署名の確認

まず最初に、署名が確認されているのかどうかの確認をしてみましょう。

コマンドはgit log --show-signatureで確認が可能です。

kazuaki@yeezy:~/fun/zenn.dev$ git log --show-signature
commit 63b4a857462ee7f29eb81fc2118a5e9acd831138 (HEAD -> master)
Author: Kazuaki Ishiguro <kazuakiishiguro@protonmail.com>
Date:   Sun Oct 17 21:01:49 2021 +0900

    added zenn-cli

commit f41e5df5c31db4b3df7561447242038c0b677ea8 (origin/master)
gpg: Signature made Mon 06 Sep 2021 10:19:01 AM JST
gpg:                using EDDSA key ...BECD98A8A99831
gpg: Good signature from "Kazuaki Ishiguro <kazuakiishiguro@protonmail.com>" [ultimate]
Author: Kazuaki Ishiguro <kazuakiishiguro@protonmail.com>
Date:   Mon Sep 6 10:19:01 2021 +0900

    Initial setup

上記のログから、コミットID63b4a857462ee7f29eb81fc2118a5e9acd831138がAuthorとDate、そしてコミットメッセージしか記載されていないのに対して、コミットIDf41e5df5c31db4b3df7561447242038c0b677ea8はgpgでの署名情報が記載されており、直近のコミットに署名がされていない事が確認できました。

コミットの編集

では早速コミットを編集してみましょう。

ターゲットの指定

使うコマンドはgit rebaseになります。

git rebaseでのコミットの編集はからターゲットとなるコミットIDの一つ前のコミットを指定する必要があります。
今回の例ですとf41e5df5c31db4b3df7561447242038c0b677ea8を指定してあげる必要があります。

kazuaki@yeezy:~/fun/zenn.dev$ git rebase -i f41e5df5c31db4b3df7561447242038c0b677ea8

# 以下エディタ内での表示

pick 63b4a85 added zenn-cli

# Rebase f41e5df..63b4a85 onto f41e5df (1 command)
#
# Commands:
......

rebaseの挙動についてより詳しく知りたいという人は公式のドキュメントを参照する事をお勧めします。

編集したいコミットIDの左にあるコマンドを変更(pick -> edit)し、保存する

上記の例ですと、以下の様に変更します。

# 以下エディタ内での表示

edit 63b4a85 added zenn-cli

# Rebase f41e5df..63b4a85 onto f41e5df (1 command)
#
# Commands:

上記の状態で保存するとエディタが終了し、ターミナル画面へと戻ってきます。

戻ってくると以下の様な画面が表示されているかと思います。

kazuaki@yeezy:~/fun/zenn.dev$ git rebase -i f41e5df5c31db4b3df7561447242038c0b677ea8
Stopped at 63b4a85...  added zenn-cli
You can amend the commit now, with

  git commit --amend

Once you are satisfied with your changes, run

  git rebase --continue

署名を追加

ステップ2ではターゲットのコミットが編集が可能な状態となりました。

親切な事にも必要なコマンドが記載されていますので、それに沿って残りのコマンドを叩けば終了です。

とは言え、今回は署名を追加するのみの編集をする事が目的なので、--no-edit-Sのオプションの指定が必要となります。

コマンドの詳細は以下です。

  • --amend 前のコミットを修正。
  • --no-edit 既存のメッセージを使用。
  • -S GPG署名を指定。

こちらのコマンドを叩くと以下のようなメッセージが表示されます。

kazuaki@yeezy:~/fun/zenn.dev$ git commit --amend --no-edit -S
[detached HEAD 2fb6f5e] added zenn-cli
 Date: Sun Oct 17 21:01:49 2021 +0900
 2 files changed, 909 insertions(+), 896 deletions(-)
 rewrite yarn.lock (96%)

編集を終了

HEADをアップデートする必要があるので、最後にrebaseを続行するオプション--continueを指定して編集を終了します。

kazuaki@yeezy:~/fun/zenn.dev$ git rebase --continue
Successfully rebased and updated refs/heads/master.

署名の再確認

それでは問題なく編集ができてるのか確認をしてみましょう。
最初と同様にgit log --show-signatureを叩きます。

kazuaki@yeezy:~/fun/zenn.dev$ git log --show-signature
commit 2fb6f5e4ef43928ae465bf904efcfd3d98a0d45e (HEAD -> master)
gpg: Signature made Sun 17 Oct 2021 09:33:28 PM JST
gpg:                using EDDSA key ...BECD98A8A99831
gpg: Good signature from "Kazuaki Ishiguro <kazuakiishiguro@protonmail.com>" [ultimate]
Author: Kazuaki Ishiguro <kazuakiishiguro@protonmail.com>
Date:   Sun Oct 17 21:01:49 2021 +0900

    added zenn-cli

commit f41e5df5c31db4b3df7561447242038c0b677ea8 (origin/master)
gpg: Signature made Mon 06 Sep 2021 10:19:01 AM JST
gpg:                using EDDSA key ...BECD98A8A99831
gpg: Good signature from "Kazuaki Ishiguro <kazuakiishiguro@protonmail.com>" [ultimate]
Author: Kazuaki Ishiguro <kazuakiishiguro@protonmail.com>
Date:   Mon Sep 6 10:19:01 2021 +0900

    Initial setup

正常にコミットを編集してGPG署名を追加する事ができました。
同様の問題に悩んでいた人の為になれば幸いです。

GitHubで編集を提案

Discussion