gpg "failed to write commit object"

14

我正在尝试在OS X Mojave上启用提交签名。

git commit -S -am "Test"

错误是:

error: gpg failed to sign the data
fatal: failed to write commit object

我尝试的:

  • gpg 工作正常(参见下文),没有安装 gpg1gpg2
  • 安装了 GPG KeyChain 并添加了新密钥(甚至添加了一个单独的仅签名子密钥)
  • 安装了 pinentry
  • gpg2 --clearsign 正常工作(为文件生成新的 .asc 文件,为纯文本输出文本)

我查看并尝试过的问题:

我做错了什么?


如果您想被添加到某个仓库中而不是在您的仓库中初始化 git-crypt,那么您需要让已经可以访问加密文件的人将您的公钥添加到该仓库的 /.git-crypt/... 部分。 - mewc
谢谢@mewc,但那不是情况,见下面我的答案。 - Alex Buznik
这只是一条消息,供下一个人参考。我认为它并不值得单独回答。 - mewc
6个回答

58

我也曾遇到这个问题。我找到了一个好的解决方案。在提交之前尝试对文件签名。

$ touch a.txt
$ gpg --sign a.txt

然后,操作系统会让您输入密码。 如果这一步骤正确,现在您可以通过正确签名来提交。


谢谢,它让我节省了很多时间! - dgebert
4
为什么需要这个? - Koray Tugay
这个行得通,但为什么要这样做?这是一个错误吗? - pradpi
1
谢谢!这帮助我找到了真正的问题:我的终端窗口太小,无法呈现密码提示。似乎git有时会隐藏错误信息。 - TheLandolorien
太棒了,省去了我做这一切的麻烦:https://dev59.com/flkS5IYBdhLWcg3ww45d - PaulIsLoud
显示剩余2条评论

21

我刚刚将关键ID添加到全局配置中

列出所有的密钥:

gpg --list-keys

选择你添加到Github上的那一个并进行设置。

git config --global user.signingkey [public key ID]

3

为了在需要时提示您输入PIN或口令,安装pinentry-mac

$ brew install pinentry-mac
$ echo "pinentry-program $(which pinentry-mac)" >> ~/.gnupg/gpg-agent.conf
$ killall gpg-agent

1
非常感谢。我在Android Studio终端中遇到了困难,因为无法看到输入密码的字段。 - undefined

3

嘿,当然,在我发布这个问题之后,我找到了解决办法。

所以我的问题是我按照这篇文档的步骤:https://help.github.com/en/articles/telling-git-about-your-signing-key

同时设置了GPGsmimesign,但当我使用 Git < 2.19 且没有适当的 X.509 密钥时出现问题。

所以我只需从全局的~/.gitconfig文件中删除与smimesign相关的部分即可。


1
在提交时找不到指定键中的用户ID的确切解决方案。 - Sasi Dhivya

2
尝试使用echo "foobar" | gpg --clearsign命令。它应该会要求您输入密钥密码并返回签名。 如果您看到以下错误消息:

error: gpg failed to sign the data
fatal: failed to write commit object

您可能需要尝试运行export GPG_TTY=$(tty)命令。如果再次测试时提示输入密码并且可以正常工作,则每次启动时都要运行此命令,并将其添加到~/.bashrc中。根据gpg-agent的文档,这是必需的,如dev.gnupg线程中所述,您可以使用man gpg-agent进行验证。
我还发现这个GitHub gist非常有用。

1

至少,那个错误信息会更清晰:

在签名验证失败时给出的错误消息曾经会将底层gpg程序的错误丢弃,这已经在Git 2.40(2023年第一季度)中得到了修正。

查看 commit ad6b320commit 8300d15(2023年2月15日)由 Johannes Schindelin (dscho) 提交。
(由 Junio C Hamano -- gitster -- 合并于 commit 38a227b,2023年2月24日)

gpg:在失败时显示gpg的错误消息

签名者:Johannes Schindelin

当签署提交失败时,很少有什么比阅读简短的“error: gpg failed to sign the data”消息更令人沮丧,接着是不出所料的“fatal: failed to write commit object”消息。

在许多情况下,当签署提交或标签失败时,gpg实际上会在其stderr中说一些有用的东西,而Git甚至会消耗它,但然后保持缄默。

教Git停止隐瞒这个相当重要的信息。


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