为什么使用 git 签署提交时 gpg-agent/pinentry 不可用?

为什么使用 git 签署提交时 gpg-agent/pinentry 不可用?

目前,我在 Windows 上运行 git 2.15.0.windows.1、gpg 2.2.1 和 gpg-agent 2.2.1。我尝试通过 pinentry/gpg-agent 使用 git 签署提交,但是,当通过 git 签署提交时,pinentry 从未出现,git 会抛出错误。我仍然能够通过 gpg 签署提交,但不能通过 git 签署。

> git commit -a -S -m "Signed Commit"
gpg: gpg-agent is not available in this session
gpg: Sorry, no terminal at all requested - can't get input
error: gpg failed to sign the data
fatal: failed to write commit object

我仍然可以通过 gpg 进行签名,无需 git:

我的gpg.conf:

keyserver hkp://keys.gnupg.net
no-tty
use-agent

当我删除最后两行时,gpg 仍会弹出 pinentry,然后 git 可以再次签署提交,但是它只会接受通过命令行而不是 pinentry 输入密码。

我怎样才能修复原始错误并让签名提交弹出 pinentry?

答案1

我能够通过设置正确的 git 配置选项来修复它。

首先,通过运行获取正确的签名gpg --list-signatures,并查找标记为sig或的签名 IDsig 3

sig 3        54ABFD17372D7B88  ...

然后将 git 配置设置user.signingkey为它:

git config --global user.signingkey 54ABFD17372D7B88

最后,设置gpg.program为二进制文件的位置gpg.exe

git config --global gpg.program "C:\Program Files (x86)\GnuPG\bin\gpg.exe"

现在,当您使用-S或提交时--gpg-sign,您应该会看到 pinentry 框。


如果您希望它与大多数 GUI 程序一起使用,例如 VS Code、GitHub Desktop 和基于 IDEA 的产品(PyCharm、Android Studio、PHPStorm 等),则应将其设置commit.gpgsign为 true:

git config --global commit.gpgsign true

这将对每个提交进行签名。如果您不想对某个特定的提交进行签名,请--no-gpg-sign在提交时使用。

答案2

我最终安装了多个 gpg 客户端。我猜是我最近更新 git 客户端时意外安装的,因为我之前在其他场合单独安装了它。我不得不分配它gpg.program才能让它再次正常工作。

git config --global gpg.program "C:\Path\To\My\Custom\gpg.exe"

相关内容