零弐壱蜂

[Ghostty] git commitのGPG署名で「Screen or window too small」エラーが発生する場合の対処法

背景

ターミナルエミュレータGhosttyを利用している環境で、git commit時のGPG署名に失敗した。

環境

  • Ghostty 1.3.0

状況

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署名の流れは以下の通りである。

  1. git commitがGPGに署名を要求する
  2. GPGがgpg-agentを呼び出す
  3. gpg-agentがパスフレーズ入力のためにpinentry-cursesを起動する
  4. 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情報を参照するようになる。

参考