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

1
请确保您的终端足够大!您可以通过运行echo test | gpg --clearsign来检查它是否太小 - 它会给您一个非常明显的错误消息。如果不够大,您的GPG代理无法显示其小的ncurses框。如果您使用GUI代理或不使用ncurses的东西,则此方法不适用。

1
我在另一个zsh变体prezto中遇到了这个问题。问题在于我的git仓库是新的,没有将node_modules添加到.gitignore中。当我将node_modules添加到.gitignore后,问题就不再出现了。因此,我的假设是由于这些大型的node_modulesgit-info需要花费时间。

1

对我来说,brew 已经更新了 gnupggpg,所以我只需要执行以下操作即可解决问题。

brew link --overwrite gnupg

这将gpg链接到正确的位置,我可以通过which gpg确认,之后一切都正常工作了。


1
将其简单设置为:

通过简单地设置:

brew uninstall gpg 

brew install gpg2

1

以上答案似乎都与我的问题不符。我的 gpg 二进制文件(/usr/local/bin/gpg -> /usr/local/MacGPG2/bin/gpg2)是作为 GPG Suite 的一部分安装的,而不是通过brew安装的。

尽管如此,我认为建议归结为:“使用在brew上可用的最新的 gpg 二进制文件”。所以我尝试了:

brew update
brew upgrade git
brew install gpg

# the following are suggestions from brew's Caveats, to make `/usr/local/bin/gpg`
# point to the brew binary:
rm '/usr/local/bin/gpg'
brew link --overwrite gnupg2

我确认已正确更改了我的$PATH中的gpg,使其指向来自brew的新可执行文件:

 which gpg
/usr/local/bin/gpg
 ls -l /usr/local/bin/gpg
lrwxr-xr-x  1 burger  admin  33 Feb 13 13:22 /usr/local/bin/gpg -> ../Cellar/gnupg2/2.0.30_3/bin/gpg

我还明确告诉了git要使用哪个gpg二进制文件:

git config --global gpg.program gpg

好的,也许这并不是完全可靠的,因为它对路径很敏感。我实际上没有确认 git 是否已经切换到调用 brew 的 gpg,以消除疑虑。

无论如何:这些都不足以使git commit成功地签署我的提交。


最终对我有用的是更新GPG Suite。 我运行的是2016.7版本,更新到2016.10后,问题得到解决。
我打开了GPG Keychain.app,然后点击“检查更新...”。使用新版本后:签名提交再次正常工作。

我尝试更新到最新版本...但那也没用。现在正在尝试登录Xcode。 - Albert T. Wong

1
为了解决这个问题,而不需要在每次重启时关闭 gpg-agent
检查您是否有多个 gpggpg-agent 的副本:
$ which -a gpg-agent
/opt/homebrew/bin/gpg-agent
/usr/local/MacGPG2/bin/gpg-agent

$ which -a gpg
/opt/homebrew/bin/gpg
/usr/local/bin/gpg
/usr/local/bin/gpg

对我来说,旧的Macbook迁移中安装了一些残留的二进制文件,这是由MacGPG2引起的。

删除这些二进制文件(和符号链接),再次检查以确保只有一个副本:

$ which -a gpg
/opt/homebrew/bin/gpg

$ which -a gpg-agent
/opt/homebrew/bin/gpg-agent

然后最后重新启动您的计算机。

gpg 应该可以正确签名,而无需终止任何进程:

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

test
-----BEGIN PGP SIGNATURE-----
Comment: GPGTools - https://gpgtools.org

iQIzBAEBCgAdFiEE1S8n.....
-----END PGP SIGNATURE-----

(从另一个问题转帖,因为这个问题的票数更高)


0

使用OSX终端代替集成的VS Code终端对我有用。VS Code集成终端一直允许我对此相同的存储库进行gpg签名,直到今天。以前当我遇到这个错误时,我通过更新VS Code来修复它,但这次更新没有起作用。


0

如果您不想使用brew安装gpg,因为它似乎会时不时地出现问题,那么只需从GPG Tools下载gpg工具即可。

在进行向导时,单击自定义安装并取消选择邮件插件(除非您想使用它)。这些工具似乎可以正常工作,而且在第一次签署提交后,它会记住您的密码。除了告诉git要使用哪个密钥之外,不需要进行任何额外的配置。

至少这是我的经验。


0
我的解决方案是偶然发现了Sascha Doemer的优雅解决方案(我稍作修改;将其存储为“gpg-no-tty”在用户的“PATH”目录中 --- “~/bin”或“~/.local/bin” --- 并记得执行“chmod +x gpg-no-tty”):
#!/bin/sh
/usr/bin/gpg --batch --no-tty "$@"

然后,如果需要为单个存储库设置(或切换到--global以设置配置项的全局值):
git config --local user.signingkey "${YOUR_SIGNING_KEY}"
git config --local commit.gpgsign true
git config --local gpg.program gpg-no-tty

注意: 我尝试编辑之前的答案,但是有太多待处理的编辑。
在我的特定情况下,当我尝试使用Emacs的版本控制(VC)进行提交更改时,出现了这个错误,使用魔术组合键C-x v v + C-c C-c(为将来遇到相同问题的Emacs用户留下此注释)。

0

这几个命令按顺序执行似乎可以解决问题,因为我在升级到Mac OS 12.4后也遇到了同样的问题。

brew upgrade gnupg
brew install pinentry-mac 
echo "pinentry-program /usr/local/bin/pinentry-mac" >> ~/.gnupg/gpg-agent.conf 
killall gpg-agent && gpg-agent --daemon
git config --global gpg.program gpg
git config --global commit.gpgsign true

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