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

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


当前回答

在我的例子中,问题在于~/.gitconfig中gpg的相对名称。我把它改成这样,问题就消失了(蒙特雷,Macbook M1):

[gpg]
    program = /opt/homebrew/bin/gpg

解释很简单:当git试图运行gpg时,它在一个新的shell中运行,而不运行~/。我为自制程序配置PATH的配置文件。所以,它根本找不到gpg。

其他回答

如果在没有Rosetta的M1芯片上使用自制程序,则需要为pin - entry程序二进制文件指定不同的位置,因为它安装在不同的位置。

Andy Hayden的更新答案需要修改如下:

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

我一定是不小心更新了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为我解决了这个问题。

我偶然发现这个错误不是因为任何配置问题,而是因为我的密钥过期了。在OSX上延长其有效性的最简单的方法是打开GPG钥匙链应用程序(如果你安装了它),它会自动提示你延长它。点击两下,就完成了。

如果你像我一样将WSL与IDE一起使用,你可能会遇到这个问题,因为使用IDE的提交接口提交时,密码“窗口”从未显示(WSL还不支持GUI应用程序)。

修复方法是简单地使用命令行git,因为它有自己的cli窗口供您输入密码。你还需要确保终端的“大”足以弹出(令人惊讶的是我知道)

我有同样的错误,在VSCode更新后。虽然我的安全提交工作正常,更新VSCode后,我得到了这个错误:

error: gpg failed to sign the data
fatal: failed to write commit object

唯一恢复功能的是这个命令:

echo "test" | gpg --clearsign

命令返回错误如下:

gpg: signing failed: Screen or window too small
gpg: [stdin]: clear-sign failed: Screen or window too small

增加终端后,我能够键入我的通行证短语。非常奇怪的情况。