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)更改为gpg
到gpg1
的位置,你可以改变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]的主要内容,如果未能解决你的问题,请参考以下文章