我参考了几篇关于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

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


当前回答

我发现检查git commit在底层做什么非常有用。使用GIT_TRACE=1运行以下提交:

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

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

在我的例子中,我发现git为签名提交选择了错误的用户和关键细节。我主要打算使用repo的本地配置,而不是全局配置,并将以下内容添加到本地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"

其他回答

在OS X上,通过brew使用gnupg2,我只需要杀死gpg代理,有时会发生:

pkill -9 gpg-agent

如果需要,设置env变量:

export GPG_TTY=$(tty)

参见常见的GPG问题和答案。

2016年10月更新:第871期提到“Git 2.9.3中签名停止工作”

Git for Windows 2.10.1于两天前(2016年10月4日)发布,修复了提交和标记的交互式GPG签名。

git中最近的gpg-sign更改(在Linux上没有问题)暴露了一个问题,即在Windows上,非msys2 -git与MSYS2-gpg交互的方式。


最初的回答:

阅读“7.4 Git工具-签名你的工作”,我假设你有你的“用户”。Signingkey”配置集。

最后一次围绕gpg的大重构(在Git 2.10之前)是在提交2f47eae2a,在这里错误消息被移动到gpg-interface.c

该文件的日志显示了提交af2b21e (Git 2.10)中最近的更改

gpg2 already uses the long format by default, but most distributions seem to still have "gpg" be the older 1.x version due to compatibility reasons. And older versions of gpg only show the 32-bit short ID, which is quite insecure. This doesn't actually matter for the verification itself: if the verification passes, the pgp signature is good. But if you don't actually have the key yet, and want to fetch it, or you want to check exactly which key was used for verification and want to check it, we should specify the key with more precision.

因此,请检查您如何指定用户。签名密钥配置和正在使用的GPG版本(gpg1或gpg2),以查看它们是否对错误消息有任何影响。

还有提交0581b54,它改变了gpg未能签署数据错误消息的条件(作为提交0d2b664的补充):

我们目前根本不从stderr读取。然而,在未来的补丁中,我们会想要这样做,所以这也为我们做好了准备(在这种情况下,gpg确实会在读取所有输入之前写入,尽管同样,键uid不太可能填满管道缓冲区)。

提交4322353显示gpg现在使用临时文件,因此可能存在正确的问题。

让我们转换为使用tempfile对象,该对象处理 对我们来说困难的案子,再加上失踪的清理电话。

经过大量搜索,我发现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密钥这里,但这应该有密钥。您可以尝试运行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

如果gnupg2和gpg-agent 2。如果使用了x,请务必设置环境变量GPG_TTY。

export GPG_TTY=$(tty)

有关常见问题,请参阅GPG的文档。

我使用M1 Mac,在那里我尝试了上面最常见的解决方案,但没有工作,我的问题是GPG二进制缺失在这里=> usr/local/bin

最初,我通过brew安装了GPG,我尝试重新安装它,但找不到它存储的二进制文件,后来我从这里安装了GPG Suite GUI => GPG Suite Tools,它工作了。

最后,我可以在Github上登录提交并获得验证徽章。