gpg无法签署致命的数据:无法写入提交对象[Git 2.10.0]

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了gpg无法签署致命的数据:无法写入提交对象[Git 2.10.0]相关的知识,希望对你有一定的参考价值。

我在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

并且很明显得到同样的错误。

答案

我在OSX遇到了这个问题。

Original answer:

似乎gpg更新(brew)更改为gpggpg1的位置,你可以改变git查找gpg的二进制文件:

git config --global gpg.program gpg1

如果你没有gpg1:brew install gpg1

Updated answer:

看起来gpg1正在被弃用/ "gently nudged out of usage",所以你可能应该实际更新到gpg2,不幸的是这涉及到更多的步骤/一点时间:

brew upgrade gnupg  # This has a make step which takes a while
brew link --overwrite gnupg
brew install pinentry-mac
echo "pinentry-program /usr/local/bin/pinentry-mac" >> ~/.gnupg/gpg-agent.conf
killall gpg-agent

第一部分安装gpg2,后者安装a hack required to use it。有关故障排除,请参阅this answer(虽然这是关于linux而不是brew),它建议一个很好的测试:

echo "test" | gpg --clearsign  # on linux it's gpg2 but brew stays as gpg

如果此测试成功(没有错误/输出包括PGP签名),您已成功更新到最新的gpg版本。

您现在应该可以再次使用git签名! 值得注意的是你需要:

git config --global gpg.program gpg  # perhaps you had this already? On linux maybe gpg2
git config --global commit.gpgsign true  # if you want to sign every commit

注意:运行已签名的提交后,您可以使用以下命令验证其签名:

git log --show-signature -1

其中包括上次提交的gpg信息。

另一答案

使用cygwin,我最近切换到gpg2。然后我在设置git config gpg.program gpg2后用git签名时遇到了同样的问题。

尝试使用echo "test" | gpg2 --clearsign来查看gpg2是否正常工作。我发现这是设置git config gpg.program gpg的最简单的解决方案,因为它有效。但是你也会以这种方式得到更好的错误 - 例如你需要安装pinentry。

另一答案

git trace对我的情况很有启发......

   GIT_TRACE=1 git commit -m "a commit message"
   13:45:39.940081 git.c:344               trace: built-in: git commit -m 'a commit message'
   13:45:39.977999 run-command.c:640       trace: run_command: gpg --status-fd=2 -bsau 'full name <your-email@domain.com>'
   error: gpg failed to sign the data
   fatal: failed to write commit object

我需要根据git检查的格式生成初始密钥。最好将日志中传递给-bsau的值复制到日志中,并在下面使用。

它变成了,

   gpg --quick-generate-key "full name <your-email@domain.com>"

然后它奏效了。

希望有所帮助。

另一答案

我遇到了同样的问题。我很高兴地报告问题不在于git 2.10.0,而在于gnupg 1.4.21

暂时将gnupg降级到1.4.20为我解决了这个问题。

如果您正在使用自制软件并且像我一样升级了软件包,那么您可以运行brew switch gnupg 1.4.20来恢复。

另一答案

如果与您的GPG密钥uid相关联的电子邮件与您在git中使用的电子邮件不同,则需要在密钥中添加其他用户ID,或者使用与电子邮件完全匹配的密钥。

您可以使用以下命令添加另一个UID:

$ gpg --edit-key

请参阅mo https://superuser.com/questions/293184/one-gnupg-pgp-key-pair-two-emails

另一答案

我必须以某种方式偶然更新gpg因为我在尝试测试gpg工作后得到了这个:

gpg: WARNING: server 'gpg-agent' is older than us (2.1.21 < 2.2.10)
gpg: Note: Outdated servers may lack important security fixes.
gpg: Note: Use the command "gpgconf --kill all" to restart them.

运行gpgconf --kill all为我修复它。

希望这有助于某人。

另一答案

可能是一个挂gpg代理。

试试gpgconf --kill gpg-agent as discussed here

另一答案

确保正确设置了电子邮件。

git config --global user.email "user@example.com"
另一答案

我有一个类似的问题与最新的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故障,请按照Can't update or use package manager -- gpg error上的说明进行操作:

在终端:

ls /usr/local/lib

那里有一堆readline libs(libreadline.so.BLAH-BLAH)所以我:

su
mkdir temp
mv /usr/local/lib/libreadline* temp
ldconfig
另一答案

上面的答案很棒,但它们对我不起作用。什么解决了我的问题是导出公钥和密钥。

列出我们从中导出的机器的密钥

$ 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

宾果邦戈,你做完了!

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

PS。我的钥匙最初是在bootcamp windows 7上制作的,我将它们导出到我的mac air(同样的物理机器,虚拟不同)

另一答案

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

尽管如此,我觉得这个建议归结为:“使用任何gpg二进制文件都是最新的brew。”所以我尝试过:

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

我验证我在gpg上正确更改了$PATH以指向brew中的新可执行文件:

以上是关于gpg无法签署致命的数据:无法写入提交对象[Git 2.10.0]的主要内容,如果未能解决你的问题,请参考以下文章

如何在Xcode源代码控制中使用GPG签名?

Mac上的git - gpg:错误:gpg无法签署数据

GPG 签署所有没有存储的 git 提交

Git之签署工具GPG的安装和使用

Git之深入解析如何通过GPG签署和验证工作

Git'致命:无法写入新的索引文件'