最近、git の GPG を設定しましたが、VSCode WSL を使用して git commit を行う際に次のようなエラーメッセージが表示されます。
Git: gpg failed to sign the data
詳細な出力は以下の通りです。
> git -c user.useConfigOnly=true commit --quiet --allow-empty-message --file -
error: gpg failed to sign the data
fatal: failed to write commit object
原因#
原因は、設定した GPG キーのパスワードを「入力」していないためです。VSCode WSL を使用する場合、パスワードを入力するためのグラフィカルなインターフェースがないため、gpg はコミットを署名することができません。
Windows のグラフィカルなインターフェースでは、gpg はパスワードを入力するための Pinentry ダイアログボックスが表示されます。しかし、VSCode WSL を使用する際には、WSL はグラフィカルなインターフェース(XServer)を使用しません。
解決方法#
解決方法は非常に簡単です:
gpg は最初に入力したパスワードをキャッシュし、一定の時間内にデータに対して複数回署名する場合は、パスワードを再入力する必要はありません。そのため、次のようなシェル関数を作成し、gpg のパスワードを手動で入力した後に vsc を使用してコミットを行います。
以下の 2 つの関数を使用します:
gpg-login() {
export GPG_TTY=$TTY
# "test"という文字列に対してgpg署名を行いますが、この時にパスワードが必要です。
# その後、パスワードはキャッシュされ、次回以降はパスワードを入力する必要はありません。
# 出力を/dev/nullにリダイレクトすることで、ターミナルに表示されません。
echo "test" | gpg --clearsign > /dev/null 2>&1
}
gpg-logout() {
echo RELOADAGENT | gpg-connect-agent
}
ターミナルで gpg-login
と入力すると、パスワードの入力ボックスが表示され、パスワードを入力した後、そのパスワードはキャッシュされます。その後、VSCode でコミットを行う際にはパスワードの入力は不要です。
gpg-logout
と入力すると、gpg
のパスワードキャッシュがクリアされます。
これは解決策ではありませんが、使用する際は便利で、許容できる方法です。
その他のシェルの設定については、ubuntu_wsl/zshrcを参照してください。
gpg キャッシュの時間設定#
~/.gnupg/gpg-agent.conf
ファイルを編集します:
以下の内容を追加すると、パスワードが 1 時間キャッシュされます。
default-cache-ttl 3600
max-cache-ttl 3600
単位は秒です。