我刚开始使用git,我通过自制软件安装git和gpg。 由于某种原因,当我提交git时,我得到了这个错误 我看了很多关于这个话题的stackoverflow问题,但没有一个对我有用。 如何修复此错误以成功上传?

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

当前回答

对于我的带有GUI和gpg 2.2.19的Linux系统,无论是杀死gpg-agent(它会重新启动自己),取消$DISPLAY或设置$GPG_TTY都对我有效,因为它试图使用pinentry-gnome从控制台询问密码。我的钥匙还没有过期。

从一个超级用户的回答类似的问题,如何迫使GPG使用控制台模式pinentry提示密码?,如果您的系统有GNOME之类的GUI,并且包管理器配置为使用GUI pinentry程序,也会出现这个问题,这就是它挂起的原因。

我不得不切换到pinentry-tty来让GPG再次对消息进行签名。在Ubuntu上,这可以通过下面链接中的步骤来完成:

sudo apt install pinentry-tty
sudo update-alternatives --config pinentry

第二个命令将向您显示pinentry程序列表,并要求您输入一个数字来选择一个,因此键入与pinentry-tty对应的数字,然后无需任何额外的工作,签名消息(和git提交)将再次工作。

其他回答

对我来说,这个错误开始发生在Debian GNU/Linux上的git标签-s,当我从pinentry-gnome3切换到pinentry-curses(使用update-alternatives——config pinentry)以方便远程访问时。它只发生在git标记-s时,而不是gpg(例如gpg——clearsign)本身。

在本例中,让它重新工作所需要的唯一更改是将export GPG_TTY=$(tty)添加到shell启动文件中。

我虽然没有得到“不适当的ioctl for device”错误消息,在这个问题的另一个答案中提到了这个修复的指示器。

注意:由于得到这个错误的原因与之前在这个问题的其他答案中建议导出GPG_TTY=$(tty)的原因完全不同(通常作为附带提示),所以我决定这个问题需要另一个答案,其中提到导出GPG_TTY=$(tty)可能是某些情况下的主要修复和唯一必要的东西。

为我解决这个问题的方法是确保密钥的名称与我的git用户名匹配。我猜邮件也要匹配。这可能与我在Mac上使用GPG钥匙串有关。不确定。

当我填写这个时,我以为我是在命名密钥,但我猜它是在询问我的名字(git用户名)。

解决方案:

Issue: Disabled loopback pinentry mode

要解决这个问题,你需要在~/.gnupg/gpg.conf中启用环回pinentry模式:

cat <<'EOF' >> ~/.gnupg/gpg.conf

use-agent 
pinentry-mode loopback

EOF

还有~/.gnupg/gpg-agent.conf(如果文件不存在就创建文件):

cat <<'EOF' >> ~/.gnupg/gpg-agent.conf

allow-loopback-pinentry

EOF

然后使用echo RELOADAGENT | gpg-connect-agent重新启动代理,您应该可以运行了!

在我的例子中,当在一个小的tmux窗口上运行git提交时,这个错误发生了,这个窗口不能适合密码短语提示。

$ echo "test" | gpg --clearsign
-----BEGIN PGP SIGNED MESSAGE-----
Hash: SHA256

test
gpg: signing failed: Screen or window too small
gpg: [stdin]: clear-sign failed: Screen or window too small

什么是gpg: GNU Privacy Guard

用法:

GPG是确保双方安全通信的一种极好的方法。它允许敏感信息在不安全的网络上轻松共享。

简单的解决方案:

步骤1:检查密钥是否过期请做

gpg -K——keyid-format SHORT

步骤2:如果它没有过期

Git配置——global user.signingkey