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

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

当前回答

如果你使用的是windows powershell(5.1+),我想这个命令可以工作。

使用此命令获取GPG程序路径。

(Get-Command gpg).Path

在获取路径之后,复制路径。 使用这个命令

git config gpg.program <your path>

试着做出承诺。 编码快乐! !

其他回答

对于我的带有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提交)将再次工作。

这在ubuntu 18.04上对我有效

检查你的gpg密钥

gpg -K --keyid-format LONG

如果得到空白响应,则生成一个GPG密钥

gpg --generate-key

重新运行第一个命令,你应该得到一个输出:

sec   rsa3072/95A854E0593B3214 2019-05-06 [SC] [expires: 2021-05-05]
      AF2F7514568DC26B0EB97B9595A854E0593B74D8
uid                 [ultimate] yourname<your_email>
ssb   rsa3072/EFD326E6C611117C 2019-05-06 [E] [expires: 2021-05-05]

设置git签名密钥

git config --global user.signingkey 95A854E0593B3214

然后你就可以开始了!(——global是可选的)

或者,如果您不介意用ssh密钥签名

git config commit.gpgsign false

请注意,由于这里和这里的问题存在安全问题,不建议这样做

使用GIT_TRACE=1查看Git失败的地方,然后检查Git使用的所有自定义配置以及它们定义的地方,然后根据您的需要覆盖:

GIT_TRACE=1 git commit -S -m "this will tell you wich intern git command failed"

git config --list --show-scope --show-origin

对我来说,我有错误:gpg未能签署数据和致命:未能写入提交对象,因为Git默认使用smimesign,即使我取消设置gpg.x509。程序钥匙,smimesign找不到我的钥匙。

所以我必须显式地告诉Git使用gpg:

git config --local gpg.x509.program gpg

Git需要知道它是用哪个密钥签名的。

在您设置了GPG、GPG -agent和GPG .conf文件(请参阅本指南)之后,您需要运行

git config --global user.signingKey EB11C755

显然,要用您自己的公钥替换最后的公钥。如果您希望在默认情况下对每个提交进行签名,请使用

git config --global commit.gpgsign true

$ gpg2 -K --keyid-format SHORT          # <-- Shows your keys, e.g.:
/home/<username>/.gnupg/pubring.kbx
-------------------------------
sec   rsa4096/0754B01E 2019-02-02 [SCA]             <--secret key
      C396BF3771782D7691B0641145E11B080754B01E
uid         [ultimate] John Doe <user@domain.com>
ssb   rsa4096/A20AB8EC 2019-02-02 [E]               <--public key

sec   rsa4096/25C504D5 2019-02-02 [SCA] [revoked: 2020-06-01]
      08BFF49B9E07E4B4B0C4946B645B6C1425C504D5
uid         [ revoked] John Doe <user2@domain.com>
uid         [ revoked] [jpeg image of size 2670]

其中A20AB8EC是本例中要查找的键ID。

我正在使用它。它支持zsh和工作在Windows子系统Linux:

export GPG_TTY=$(tty)

其他用户已经确认以上是MacOS(例如Catalina 10.15.7)所需的唯一更改。对于mac,将以上内容添加到~/.zshrc。

在使用WSL2的Windows中的Linux容器中也可以工作。