我刚开始使用git,我通过自制软件安装git和gpg。 由于某种原因,当我提交git时,我得到了这个错误 我看了很多关于这个话题的stackoverflow问题,但没有一个对我有用。 如何修复此错误以成功上传?
error: gpg failed to sign the data
fatal: failed to write commit object
我刚开始使用git,我通过自制软件安装git和gpg。 由于某种原因,当我提交git时,我得到了这个错误 我看了很多关于这个话题的stackoverflow问题,但没有一个对我有用。 如何修复此错误以成功上传?
error: gpg failed to sign the data
fatal: failed to write commit object
当前回答
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。
其他回答
对于我的带有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提交)将再次工作。
解决方案:
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重新启动代理,您应该可以运行了!
源
使用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
我刚刚在VSCode更新时遇到了这个问题。我认为GPG代理挂起了,因为该命令在出错之前运行了几秒钟。运行gpgconf——kill gpg-agent重置并为我修复了它。
对于故障排除,首先要尝试两件事:
运行gpg——version,并确保安装了GnuPG版本2+(而不是版本1) 执行echo "test" | GPG——clearsign命令,确认GPG本身在工作
如果一切看起来都没问题,接下来要尝试的一件事是:
运行brew install pinentry以确保您已经安装了用于密码短语输入的良好工具
如果在安装之后,你再次尝试git提交,仍然得到一个“failed to sign the data”错误,请执行:
执行gpgconf——kill gpg-agent命令杀死任何可能挂起的正在运行的代理
否则,运行一些基本步骤来检查你是否有一个正常工作的GnuPG环境:
执行gpg -K——keyid-format SHORT命令,检查至少有一个密钥对没有过期
如果输出显示你没有供GnuPG使用的密钥,你需要创建一个:
运行gpg——gen-key,让GnuPG引导您完成创建密钥对的步骤
如果你得到一个错误消息说“不合适的ioctl为设备”,这样做:
运行export GPG_TTY=$(tty)和/或将其添加到~/。Bashrc或~ /.bash_profile