gpg签名数据失败 致命错误:无法写入提交对象 [Git 2.10.0]

719

我阅读了关于pretty属性在Git 2.10版本发布说明中的几篇文章。通过阅读这些文章,将git升级到2.10.0,并对全局.gitconfig进行了更改,结果如下 -

[filter "lfs"]
    clean = git-lfs clean %f
    smudge = git-lfs smudge %f
    required = true
[user]
    name = xyz
    email = abc.def@gmail.com
    signingkey = AAAAAAA
[core]
    excludesfile = /Users/xyz/.gitignore_global
    editor = 'subl' --wait
[difftool "sourcetree"]
    cmd = opendiff \"$LOCAL\" \"$REMOTE\"
    path = 
[mergetool "sourcetree"]
    cmd = /Applications/SourceTree.app/Contents/Resources/opendiff-w.sh \"$LOCAL\" \"$REMOTE\" -ancestor \"$BASE\" -merge \"$MERGED\"
    trustExitCode = true
[alias]
    lg = log --graph --pretty=format:'%Cred%h%Creset -%C(yellow)%d%Creset %s %Cgreen(%cr) %C(bold blue)<%an>%Creset' --abbrev-commit --date=relative
[color "diff"]
    old = red strike
    new = green italic

但现在我尝试使用签署我的提交的方式

git commit -a -S -m "message"

我看到了以下错误信息 -

您需要输入密码来解锁用户“XYZ(数字签名)”的秘密密钥

2048位RSA密钥,ID为AAAAAAAA,创建于2016年07月01日

错误:gpg无法签署数据致命错误:无法编写提交对象

注意 - 我仍然可以使用git commit -a -m“message”提交更改 有没有办法克服这个问题?或者需要在gpg配置中进行任何更改以适应git的升级?

更新 1

在阅读Is there a way to "autosign" commits in Git with a GPG key?之后,我希望进一步提高其实用性。我已经使用配置了密钥。

git config --global user.signingkey ED5CDE14(with my key) 
git config --global commit.gpgsign true

很明显,无论如何都会出现相同的错误。


5
我遇到了类似的问题。我在Windows上卸载了Git 2.8(git-scm),然后安装了2.10版本。现在每次使用“-S”命令时都会出现“gpg failed to sign the data”的错误提示。在2.8版本中,我可以顺利地签署提交记录,但现在不知道出了什么问题。 - Illuminator
11
添加 user.signingkey 解决了我的问题,很奇怪。 - Xavier Ho
3
有点讽刺的是,我更换了电脑重新设置一切,结果却在寻找自己的问题时发现没有一个建议的解决方案足够简单干净,可以让我轻松开始。 - Naman
60
尝试运行 gpgconf --kill gpg-agent 命令,详情请见此处讨论 - Lounge9
17
请确保 git config --get-all user.namegit config --get-all user.email 与用于签名的密钥相同,可以通过 gpg -K --keyid-format SHORT 进行检查。 - Max Vorobjev
显示剩余10条评论
51个回答

3
如果你和我一样,同时使用WSL和IDE,你可能会在使用IDE的提交界面进行提交时遇到这个问题,因为密码短语“window”从不显示(WSL尚未支持GUI应用程序)。
解决方法是简单地使用命令行git,因为它有自己的cli窗口供您输入密码短语。您还需要确保终端足够“大”才能弹出(令人惊讶吧)。 signing commits using WSL

我还是不敢相信这个解决了我的问题。谢谢你! - rufatZZ

3

我的VSCode更新后,出现了相同的错误。尽管我的安全提交之前运行良好,在VSCode更新后我遇到了这个错误:

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

唯一恢复功能的方法是执行以下命令:
echo "test" | gpg --clearsign

该命令出现错误,错误信息如下:
gpg: signing failed: Screen or window too small
gpg: [stdin]: clear-sign failed: Screen or window too small

增大终端后,我可以输入我的密码短语。非常奇怪的情况。


2

如果这只是突然发生的,并且在过去一直运行得很完美,就像我的情况一样,请尝试注销(cmd+shift+q)并重新登录。对我有效。


2

和 @birchlabs 一样,经过大量挖掘和搜索,我发现问题不在 GPG 上,而是在 GPG 套件上。我运行了 cask reinstall gpg-suite 命令,问题得到解决。


2

如果你在使用 Visual Studio Code 提交代码时遇到问题,但已经设置了 GPG 签名,那么用一行 bash 命令解决:

git config --global gpg.program `which gpg2`

如果您的PATH中有gpg但没有gpg2,那么只需使用它即可。

2
我在 Ubuntu 18.04 上遇到了同样的错误,也担心了几周。最终发现 gpg2 没有指向任何东西。所以只需运行以下命令:
git config --global gpg.program gpg

“Tada,它就像魔法一样运作。”

Signed commit

您的提交现在将带有已验证的标签。

2
在我的情况下,所有的解决方案都无法工作,因为我没有手动进入我的~/.gitconfig并删除以下内容,因为我创建了一个不再是我的旧X.509密钥的新密钥,所以我删除了以下内容,然后我的新密钥开始工作。
[gpg]
    program = gpg
    format = x509
[gpg "x509"]
    program = smimesign

2

对我有用的解决方案是:

  • 首先,我尝试了解为什么这不起作用。在终端上尝试以下命令:
   $ echo "Hello" > test.txt
   $ gpg --sign --default-key <your-email-id> test.txt
  • 观察到的错误详情为:gpg:签名失败:无pinentry
gpg-agent[59045]: can't connect to the PIN entry module '/usr/local/bin/pinentry': IPC connect call failed
gpg-agent[59045]: failed to unprotect the secret key: No pinentry
  • 我在终端中输入以下命令:
    cat ~/.gnupg/gpg-agent.conf
  • 检查以下语句是否存在。如果在gpg-agent.conf中不存在,则需要添加。

pinentry-program /usr/local/MacGPG2/libexec/pinentry-mac.app/Contents/MacOS/pinentry-mac

  • 添加pinentry路径后,请运行。
    $ gpgconf --kill gpg-agent
    $ gpg --sign --default-key <your-email-id> test.txt

  • 查看输出:
 gpg: using <your-email-id> as default secret key for signing

2

我曾遇到过类似的问题,使用最新版本的Git源码(2.12.2)与所有其依赖项(Zlib、Bzip、cURL、PCRE、ReadLine、IDN2、iConv、Unistring等)的最新源代码一起构建。

事实证明,libreadline导致了GnuPG的问题:

$ gpg --version
gpg: symbol lookup error: /usr/local/lib/libreadline.so.7: undefined symbol: UP

当然,尝试使用-vvv从Git获取有用信息失败了,因此失败原因是个谜。

要解决由于ReadLine导致的PGP失败,请按照无法更新或使用软件包管理器--gpg错误中的说明进行操作:

In terminal:

ls /usr/local/lib

there was a bunch of readline libs in there (libreadline.so.BLAH-BLAH) so i:

su
mkdir temp
mv /usr/local/lib/libreadline* temp
ldconfig

1
在我的情况下,其他答案提到的解决方案都没有起作用。我发现问题是特定于一个存储库的。删除并重新克隆该存储库可以解决这个问题。

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