我参考了几篇关于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问题和答案。

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

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

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

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

这几个命令似乎对我有用,因为我个人在升级到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

使用以下命令检查gpg是否启用

git config -l | grep gpg

如果它返回true,运行以下命令禁用它

git config --global --unset commit.gpgsign

成功运行上述命令后,应该可以运行git commit命令。

我用这个简单的食谱来做:

在macOS上自动签名提交(全局和不同的ide):

用这种方法获取签名密钥。

brew install gnupg gnupg2 pinentry-mac
git config --global user.signingkey <YOUR_SIGNING_KEY>
git config --global commit.gpgsign true
git config --global gpg.program gpg

将以下内容放入gpg.conf文件(使用nano ~/.gnupg/gpg.conf命令编辑文件):

no-tty

将以下内容放入gpg-agent.conf文件中(使用nano ~/.gnupg/gpg-agent.conf命令编辑文件):

pinentry-program /usr/local/bin/pinentry-mac

更新:

根据评论中的建议,您可能需要在编辑配置文件gpg.conf后执行killall gpg-agent命令。不用说,这个命令将终止GPG (Gnu Privacy Guard)代理。