野声

Hey, 野声!

谁有天大力气可以拎着自己飞呀
twitter
github

VSCode WSL で Git の記録に GPG を使用して署名する

最近、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

単位は秒です。

参考リンク#

読み込み中...
文章は、創作者によって署名され、ブロックチェーンに安全に保存されています。