我参考了几篇关于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-bit RSA key, ID AAAAAAAA, created 2016-07-01 错误:GPG数据签名失败致命:写提交失败 对象

注意-我仍然可以使用git commit -a -m "message"来提交更改

有办法克服同样的问题吗?或者在gpg配置中需要做任何改变以适应git的升级?


更新1

还寻求进一步的有用性,以下是是否有一种方法在Git中使用GPG密钥“自动签名”提交?我已经配置了密钥使用

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

很明显得到了相同的错误。


当前回答

我也见过类似的答案,但没有一个完全适合我。在Linux上,我必须杀死并重新启动我的gpg-agent:

$ pkill gpg-agent
$ gpg-agent --daemon
$ git commit ...

这招对我很管用。看起来你确实需要用户。Signingkey设置为您的私钥,以及从其他一些评论说。

$ git config --global user.signingkey [your_key_hash]

其他回答

我在Ubuntu 18.04上得到了同样的错误,也担心了几个星期。 最后意识到gpg2没有指向任何东西。 所以简单地运行

git config --global gpg.program gpg

然后,它就像魅力一样。

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

我的观点是:

当您创建并向gpg-agent添加密钥时,您定义了称为passphrase的东西。现在这个密码短语在某个时候到期了,gpg需要您再次输入它来解锁密钥,以便您可以再次开始签名。

当您使用任何其他与gpg接口的程序时,gpg提示您输入您的密码短语不会出现(基本上gpg-agent在守护时不可能在stdin中显示输入对话框)。

其中一个解决方案是gpg——sign a_file.txt,然后输入您在创建密钥时输入的密码,然后一切都应该正常(gpg-agent应该自动签名)

关于如何为密码短语设置更长的超时,以便您不必一直这样做,请参阅此答案。

或者您可以使用ssh-keygen -p完全删除密码短语

编辑:做一个man gpg-agent来阅读一些关于如何自动发生上述情况的内容,并添加以下行:

GPG_TTY=$(tty)
export GPG_TTY

如果你正在使用bash(这是正确的答案,但我也保持我的思路),然后来源你的.bashrc文件或重新登录。

按照下面的url设置签名提交 https://help.github.com/en/articles/telling-git-about-your-signing-key

如果还在 GPG签署数据失败致命: 日志含义写提交对象失败

这不是git的问题,而是GPG的问题 遵循以下步骤

gpg——版本 回显"test" | GPG—clearsign

如果显示:

gpg: signing failed: Inappropriate ioctl for device
gpg: [stdin]: clear-sign failed: Inappropriate ioctl for device

然后使用export GPG_TTY=$(tty) 然后再次尝试echo“test”| GPG—clearsign 得到PGP签名。 Git config -l | grep GPG

gpg.program=gpg
commit.gpgsign=true

应用git commit -m "commitMsz"

可能有助于杀死进程gpg-agent可能卡住旧数据。因此,新启动的gpg-agent将要求输入密码。

我在构建最新的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错误的说明:

在终端: ls /usr/local/lib 这里有很多readline lib (libreadline。so。blah - blah) 所以我: 苏 mkdir临时 Mv /usr/local/lib/libreadline* temp ldconfig