Git GPG签名失败没有明确的错误信息。

24

如果我设置Git使用我的GPG密钥进行签名,则会失败。我尝试了GIT_TRACE,但它并没有给我更多的信息:

$ GIT_TRACE=1 git commit
15:29:35.112157 git.c:344               trace: built-in: git 'commit'
15:29:35.115745 run-command.c:626       trace: run_command: 'code --wait' '/Users/b/VurbAgency/haarlem.github.io/.git/COMMIT_EDITMSG'
15:29:52.884006 run-command.c:626       trace: run_command: 'gpg' '--status-fd=2' '-bsau' 'SECRETKEYID'
error: gpg failed to sign the data
fatal: failed to write commit object

当我尝试运行'gpg' '--status-fd=2' '-bsau' 'SECRETKEYID'时,它只是在说完BEGIN_SIGNING H8后就停止工作了,什么也没有做。

有什么解决方法或者研究途径吗?

5个回答

38

当我遇到同样的错误时,我已经使用最新版本的gpg(2.2.17),但我偶然发现了解决方法。对我来说,这个问题有多个方面需要解决。

  1. 在提交之前,我必须运行$ export GPG_TTY=$(tty)。这会提示输入密码。
  2. 如果我使用带特殊字符的密码,它将无法正常工作(提示我使用了错误的密码),所以我只能使用字母数字密码。

如果你想用这个方法在GitHub上进行验证提交,请确保名称和电子邮件地址与你在GitHub上的信息匹配。


9
当我运行export GPG_TTY=$(tty)时,对我来说没有任何反应。 - ReinstateMonica3167040
1
我也是一样,这个命令没有任何作用。你找到解决方法了吗?@ReinstateMonica3167040 - JoeyMousepad
我还需要将 gpg-connect-agent updatestartuptty /bye >/dev/nullexport GPG_TTY=$(tty) 添加到我的 .bashrc 中,这样才能正确显示GPG密码提示 (gpg --status-fd=2 -bsau <id>)。在Arch Wiki上找到了解决方法:https://wiki.archlinux.org/title/GnuPG#Configure_pinentry_to_use_the_correct_TTY - Andreas Nasman
1
谢谢 - 这对我有用。下次我尝试提交时,输入了我的密码,,再也没有无法签署数据的错误了。 - Jacob G

12

如果你使用Homebrew安装了gpg,并且也在使用GPGTools,那么你需要卸载Homebrew的gpg。

# Uninstall gpg in homebrew so that it uses the gpg in GPGTools instead
$ brew uninstall gpg

# You might need to do some extra cleanup afterward as well:
$ rm -r /opt/homebrew/etc/gnupg

# Restart the gpg-agent so that it uses the correct one:
$ gpgconf --kill gpg-agent

之后,git又可以对我的提交进行签名了。


1
这就是我的问题所在!在计算机重新启动后,我的电脑决定使用Homebrew的gpg。 - nshoes
1
这就是原因!当我设置 GPG 时,我过于热心了,安装了我不需要的软件包。感谢这条评论,现在我知道我不是做得太充分了,而是自己给自己找麻烦。 - Kurt

4

我看到我的 GPG 版本是 2.2.5,而最新版本是 2.2.10,于是使用 brew upgrade gpg 命令更新了我的 mac 上的 GPG。

目前为止,这解决了问题。然而,我仍然不清楚这个问题的原因。


3
我遇到了同样的问题。在GnuPG配置文件~/.gnupg/gpg-agent.conf中,pinentry-program路径指向pinentry-mac,但是这个文件缺失了。
运行brew install pinentry-mac就可以解决问题。

0
我遇到了类似的错误:BEGIN_SIGNING H10
在OSX上,为了解决这个问题,我运行了gpgconf --kill gpg-agent

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接