M1 MacでもVerifiedコミットするぞと、GPGキーをインポートしたら、エラーになってコミットが出来ない状態になってしまった。
その原因と解決方法について書いておく。

はじめに

今回は、Intel Macで出力したGPGキーを、M1 Macでインポートした際に発生したエラーの解決方法です。
パスコードの入力には pinentry-mac を使用しており、export GPG_TTY=$(tty) は設定している前提となる。
GPGキーのインポート方法や、GPGキーを使ってコミットに署名を付ける方法は以下の記事を参照して欲しい。

発生するエラー

GPGキーのインポートではエラーにならないが、コミットをすると以下のように失敗する状態になってしまう。

$ git commit -m "失敗するよ"

> error: gpg failed to sign the data
> fatal: failed to write commit object

簡単な文字列で実行してもエラーになってしまう。

$ echo "test" | gpg --clearsign

> -----BEGIN PGP SIGNED MESSAGE-----
> Hash: SHA512
> test
> gpg: signing failed: No pinentry
> gpg: [stdin]: clear-sign failed: No pinentry

エラーの解決方法

エラーの原因は、pinentry-mac のパスが変わっているためです。

# Intel Mac
$ which pinentry-mac

> /usr/local/bin/pinentry-mac
# M1 Mac
$ which pinentry-mac

> /opt/homebrew/bin/pinentry-mac

なので、~/.gnupg/gpg-agent.conf に書いているパスを変更するだけで直るはず。

- pinentry-program /usr/local/bin/pinentry-mac
+ pinentry-program /opt/homebrew/bin/pinentry-mac

変更したら、GPGを再起動させるために gnupg-agent を終了させる必要がある。
起動は自動なので、終了させるだけでOK。

$ gpgconf --kill gpg-agent

試しにもう一度、簡単な文字列で実行してみる。

$ echo "test" | gpg --clearsign

> -----BEGIN PGP SIGNED MESSAGE-----
> Hash: SHA512
> test
> -----BEGIN PGP SIGNATURE-----
> iHUEARYKAB0WIQTJMsSbSxup6Xnu6kqds4l7OZU5aQUCYckcLQAKCRCds4l7OZU5
> adAtAP94EcA3VLolDM5CokS++Llkwk1sRqagiPfd7ZNG6wVu7AEA+/9dZ3GD7yA9
> xVbgjySY97msTsJWp7mQcJPHQhAzgw8=
> =AR63
> -----END PGP SIGNATURE-----

このようなログが出ていれば成功となる。
コミットも出来るようになっているので試して欲しい。

おまけに

インポートしたGPGのリストを見ると以下のようになっている。

$ gpg --list-secret-keys --keyid-format=long

> /Users/username/.gnupg/pubring.kbx
> ------------------------------------
> sec   ed25519/[GPGキーID] YYYY-MM-DD [SC]
>       ****
> uid         [ unknown] YOURNAME (COMMENT) <YOUREMAIL>
> ssb  cv25519/**** YYYY-MM-DD [E]

この [ unknown] というのが気になってしかたない。
以下のコマンドを実行すれば [ultimate] にすることが出来る。

$ gpg --edit-key [GPGキーID] trust quit

> gpg (GnuPG) 2.3.4; Copyright (C) 2021 Free Software Foundation, Inc.
> This is free software: you are free to change and redistribute it.
> There is NO WARRANTY, to the extent permitted by law.
> Secret key is available.
> sec ed25519/[GPGキーID]
>    created: YYYY-MM-DD expires: never    usage: SC  
>    trust: ultimate   validity: unknown
> ssb cv25519/8A1C1B0A15331D56
>    created: YYYY-MM-DD expires: never    usage: E  
> [ unknown] (1). YOURNAME (COMMENT) <YOUREMAIL>
> sec ed25519/[GPGキーID]
>    created: YYYY-MM-DD expires: never    usage: SC  
>    trust: ultimate   validity: unknown
> ssb cv25519/****
>    created: YYYY-MM-DD expires: never    usage: E  
> [ unknown] (1). YOURNAME (COMMENT) <YOUREMAIL>
> Please decide how far you trust this user to correctly verify other users’ keys
> (by looking at passports, checking fingerprints from different sources, etc.)
>  1 = I don’t know or won’t say
>  2 = I do NOT trust
>  3 = I trust marginally
>  4 = I trust fully
>  5 = I trust ultimately
>  m = back to the main menu
> Your decision? 5

> Do you really want to set this key to ultimate trust? (y/N) y

> sec ed25519/[GPGキーID]
>    created: YYYY-MM-DD expires: never    usage: SC  
>    trust: ultimate   validity: unknown
> ssb cv25519/****
>    created: YYYY-MM-DD expires: never    usage: E  
> [ unknown] (1). YOURNAME (COMMENT) <YOUREMAIL>

以上です。おつかれさまでしたー