![为什么使用 git 签署提交时 gpg-agent/pinentry 不可用?](https://linux22.com/image/1546111/%E4%B8%BA%E4%BB%80%E4%B9%88%E4%BD%BF%E7%94%A8%20git%20%E7%AD%BE%E7%BD%B2%E6%8F%90%E4%BA%A4%E6%97%B6%20gpg-agent%2Fpinentry%20%E4%B8%8D%E5%8F%AF%E7%94%A8%EF%BC%9F.png)
目前,我在 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"