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

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

当前回答

在我的例子中,我混合了提交签名文档中给出的gpg配置和smimesign配置:https://help.github.com/en/github/authenticating-to-github/telling-git-about-your-signing-key

在工作了几个小时之后,我发现纠正它的最好方法是取消与gpg相关的所有内容,并重新配置gpg。

正如在@Jason Thrasher的回答中提到的,使用以下方法找到所有与gpg相关的git配置:

git config -l | grep gpg

然后取消所有的golable以及本地使用:

git config --global --unset <config_name>
git config --local --unset <config_name>

然后按照上面给出的官方文档重新配置。 希望这能有所帮助。

其他回答

我已经做了一个git密钥,有3个单独的密钥用于认证/签名/加密&密钥在未来显示过期(在正常工作几天后):

pub   rsa4096/4CD1E9DA 2017-04-26 [C] [expired: 2017-04-28]
      Key fingerprint = 4670 59C1 7592 08B8 7FA5  313B 2A42 B6A6 4CD1 E9DA
uid         [ expired] Stuart Cardall (GIT Development Keys) <xxxxxx>
sub   rsa4096/5195E715 2017-04-26 [E] [expired: 2019-04-26]
sub   rsa4096/DB74C297 2017-04-26 [S] [expired: 2019-04-26]
sub   rsa2048/A3913A3C 2017-04-28 [] [expired: never     ]

在不添加单独子键的情况下创建一个新键来解决问题。

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

使用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

参考@sideshowbarker和@Xavier Ho解决方案,我通过以下步骤解决了我的问题。

假设gpg2通过brew安装,

git config --global gpg.program gpg2
brew install pinentry
gpgconf --kill gpg-agent
gpg2 -K --keyid-format SHORT
// no key found then generate new one
gpg2 --gen-key

gpg2 -K --keyid-format SHORT 

           

... - dpg gnupg - pubring。

sec rsa2048/0A61C6FC 2017-06-29 [SC][有效期:2019-06-29]

git config --global user.signingkey 0A61C6FC

经同事提醒,需要追加

export GPG_TTY=$(tty)

~ /。ZSHRC如果使用zsh,否则追加到~/.bash_profile


For macOS,

gpg2在brew中与GPG结合,因此GPG命令指向gpg2

brew install gpg2

酿造信息GPG

Gnupg:稳定2.2.6(瓶装)

git config --global gpg.program gpg
gpg -K --keyid-format SHORT 

还有pinentry-mac用于密码输入

brew install pinentry-mac
vim ~/.gnupg/gpg-agent.conf

添加一行

pinentry-program /usr/local/bin/pinentry-mac

经同事提醒,需要追加

export GPG_TTY=$(tty)

~ /。ZSHRC如果使用zsh,否则追加到~/.bash_profile

在我的例子中,我混合了提交签名文档中给出的gpg配置和smimesign配置:https://help.github.com/en/github/authenticating-to-github/telling-git-about-your-signing-key

在工作了几个小时之后,我发现纠正它的最好方法是取消与gpg相关的所有内容,并重新配置gpg。

正如在@Jason Thrasher的回答中提到的,使用以下方法找到所有与gpg相关的git配置:

git config -l | grep gpg

然后取消所有的golable以及本地使用:

git config --global --unset <config_name>
git config --local --unset <config_name>

然后按照上面给出的官方文档重新配置。 希望这能有所帮助。