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个回答

5

请确保您的电子邮件设置正确。

git config --global user.email "user@example.com"

1
这是唯一对我有效的解决方案,遵循通过 github 生成 GPG 密钥的正确方法非常有帮助。 - Naz
2
在我的情况下,问题是我在特定的存储库中使用了公司电子邮件,但我没有生成PGP密钥。 - rubick
由于这个问题经常在谷歌上出现,这个非常有帮助的答案应该排在答案列表的更高位置。在卸载和安装大量软件来修复没有问题的东西之前,只需检查您是否指定了正确的电子邮件地址即可。 - Arthur Khazbs

5
我遇到了同样的问题。很高兴地告诉大家,问题不在于git 2.10.0,而是在于gnupg 1.4.21
暂时将gnupg降级到1.4.20对我来说解决了这个问题。
如果您使用homebrew并且像我一样升级了软件包,那么您可能只需要运行brew switch gnupg 1.4.20来恢复以前的版本。

5

我发现检查一下 git commit 在幕后是如何运作非常有帮助。使用以下命令并加上 GIT_TRACE=1 来提交:

GIT_TRACE=1 git commit -S -m "MESSAGE"

这将展示git在提交时使用的用户名、电子邮件和签名密钥。

在我的情况下,我发现git选错了用户和密钥详情来签署提交。我主要打算使用存储库的本地配置而不是全局配置,并将以下内容添加到本地git配置文件(位于“REPO_PATH / .git / config”)可使终端和VSCode中的提交签名工作。

[user]
    name = USER NAME
    email = USER EMAIL
    signingKey = SIGNING KEY

以下也可以进行设置:

git config --local user.name "USER NAME"
git config --local user.email "USER EMAIL"
git config --local user.signingkey "USIGNING KEY"

1
谢谢提到 GIT_TRACE=1,这帮助我找到了问题的根本原因。 - Juan Tarquino

5

在我的情况下,问题出在 ~/.gitconfig 内的相对名称 gpg 上。我将其更改为以下内容后,问题消失了(Monterey,Macbook M1):

[gpg]
    program = /opt/homebrew/bin/gpg

解释很简单:当git尝试运行gpg时,它会在一个新的shell中执行,而不运行~/.profile文件,我在该文件中为homebrew配置了PATH。因此,它无法找到gpg

4

以上的回答很好,但对我并没有起作用。解决我的问题的是导出公钥私钥

列出我们正在导出密钥的计算机上的密钥列表。

$ gpg --list-keys
/home/user/.gnupg/pubring.gpg
--------------------------------
pub 1024D/ABCDFE01 2008-04-13
uid firstname lastname (description) <email@example.com>
sub 2048g/DEFABC01 2008-04-13

导出密钥。
$ gpg --output mygpgkey_pub.gpg --armor --export ABCDFE01
$ gpg --output mygpgkey_sec.gpg --armor --export-secret-key ABCDFE01

前往我们正在导入的机器并进行导入操作。

$ gpg --import ~/mygpgkey_pub.gpg
$ gpg --allow-secret-key-import --import ~/mygpgkey_sec.gpg

完成了,bingo bongo!

参考资料:https://www.debuntu.org/how-to-importexport-gpg-key-pair/

注:我的密钥最初是在引导程序Windows 7上生成的,并将它们导出到我的Mac Air上(同一物理机器,不同虚拟机器)。


4

经过大量搜索,我发现在我的情况下,gpg密钥是问题所在。

为了检查gpg密钥是否是您的问题,请首先检查以下输出:

GIT_TRACE=1 git commit -m 'message'

如果有错误,你会看到类似下面的信息:

10:37:22.346480 run-command.c:637       trace: run_command: gpg --status-fd=2 -bsau <your GPG key>

这里显示的是我的姓名和电子邮件,但应该显示密钥。您可以尝试运行gpg --status-fd=2 -bsau <您的GPG密钥>

要更新正确的密钥,请执行以下操作: 使用以下命令检查密钥:gpg --list-secret-keys --keyid-format=long

它应该有以下输出:

/Users/hubot/.gnupg/secring.gpg
------------------------------------
sec   4096R/3AA5C34371567BD2 2016-03-10 [expires: 2017-03-10]
uid                          Hubot 
ssb   4096R/42B317FD4BA89E7A 2016-03-10

然后使用以下方法更新密钥:

git config --global user.signingkey 3AA5C34371567BD2

现在重新检查提交,如果密钥是问题,那么它应该会成功。您需要设置密码来更新密钥,您可以使用 GitHub 文档执行此操作。
更多详细信息请查看:https://gist.github.com/paolocarrasco/18ca8fe6e63490ae1be23e84a7039374

4
除了没有正确设置git的gpg密钥外,另一个可能的问题是:在带有X转发的ssh会话内尝试提交。这种情况下,它可能会尝试调用GUI,如果未设置环境变量DISPLAY,则会失败。
您可以通过编辑您的~/.gnupg/gpg-agent.conf来强制gpg-agent使用仅tty工具。
pinentry-program /usr/bin/pinentry-tty

然后重新加载配置:

gpg-connect-agent reloadagent /bye

(当然首先要安装pinentry-tty)

“gpg-connect-agent reloadagent /bye” 对我很有帮助。谢谢! - Barry

4

以上方法都对我没用,我通常使用IDE终端。

我时不时地遇到这个错误,在大多数情况下它都能正常工作。 经过运行后我查明了问题所在:

 echo "test" | gpg --clearsign

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

解决方案:只需增加终端窗口的大小即可。

4

这在Ubuntu上突然发生,不确定是最近的更新导致的,但现有的问题都不适用于我(我设置了GPG_TTY,尝试杀死代理等)。gpg命令无法执行,并显示以下错误:

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

test
gpg: signing failed: Operation cancelled
gpg: [stdin]: clear-sign failed: Operation cancelled

我尝试使用--debug-all选项运行gpg,并注意到以下输出:
gpg: DBG: chan_3 <- INQUIRE PINENTRY_LAUNCHED 27472 gnome3 1.1.0 /dev/pts/6 screen-256color -
gpg: DBG: chan_3 -> END
gpg: DBG: chan_3 <- ERR 83886179 Operation cancelled <Pinentry>
gpg: signing failed: Operation cancelled

上述内容表明,pinentry程序存在某些问题。通常情况下,Gpg会为我运行pinentry-curses,因此我将其更改为pinentry-tty(首先必须执行aptitude install),然后错误消失了(虽然我不再获得全屏密码输入,但我也不喜欢那样)。要进行此更改,我必须将pinentry-program /usr/bin/pinentry-tty添加到~/.gnupg/gpg-agent.conf文件中,并使用gpgconf --kill gpg-agent命令终止代理(代理会在下次自动重启)。

3
如果与您的GPG密钥UID相关联的电子邮件与您在git中使用的电子邮件不同,则需要向您的密钥添加另一个用户ID,或者使用与电子邮件完全匹配的密钥。您可以使用以下命令添加另一个UID: $ gpg --edit-key
有关更多信息,请参见:https://superuser.com/questions/293184/one-gnupg-pgp-key-pair-two-emails

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