背景
ターミナルエミュレータGhosttyを利用している環境で、git commit時のGPG署名に失敗した。
ターミナルエミュレータGhosttyを利用している環境で、git commit時のGPG署名に失敗した。
git commitを実行すると、以下のエラーが発生しコミットできない。
❯ git commit -m 'upgrade: modules'
error: gpg failed to sign the data:
[GNUPG:] KEY_CONSIDERED ███████████████████████████
[GNUPG:] BEGIN_SIGNING H10
[GNUPG:] PINENTRY_LAUNCHED 4897 curses 1.3.1 /dev/ttys000 xterm-ghostty - 20620/501/4 501/20 0
gpg: signing failed: Screen or window too small
[GNUPG:] FAILURE sign 83886381
gpg: signing failed: Screen or window too small
fatal: failed to write commit object確認すべきはPINENTRY_LAUNCHEDの行である。pinentry cursesが起動され、ターミナルタイプとしてxterm-ghosttyが渡されている。
このエラーはpinentry-cursesがターミナルのウィンドウサイズを正しく取得できないことに起因する。
GPG署名の流れは以下の通りである。
git commitがGPGに署名を要求するgpg-agentを呼び出すgpg-agentがパスフレーズ入力のためにpinentry-cursesを起動するpinentry-cursesがターミナルのサイズを確認するgpg-agentは一度起動するとバックグラウンドで常駐する。別のターミナルエミュレータから起動されたgpg-agentが古いターミナル情報をキャッシュしている場合や、Ghosttyのxterm-ghosttyというターミナルタイプをpinentry-cursesが正しく認識できない場合に、このエラーが発生する。
gpg-agentを再起動することで解消する。
# gpg-agentを停止
gpgconf --kill gpg-agent
# gpg-agentを再起動
gpgconf --launch gpg-agent再起動後、git commitを実行すればGPG署名が正常に完了する。
# 署名のテスト
echo "test" | gpg --clearsign上記コマンドで署名済みテキストが出力されれば、GPG署名は正常に動作している。
この問題はターミナルエミュレータを切り替えた際やOSの再起動後に再発する可能性がある。毎回手動で再起動する運用を避ける場合は、シェルの設定ファイルに以下を追加する。
# ~/.zshrc または ~/.bashrc に追加
# GPGのTTYを現在のターミナルに設定
export GPG_TTY=$(tty)GPG_TTYを設定することで、gpg-agentが常に現在のターミナルのTTY情報を参照するようになる。