我参考了几篇关于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_TRACE=1显示了git实际在做什么:

$ GIT_TRACE=1 git commit -m "example commit message"
20:52:58.902766 git.c:328               trace: built-in: git 'commit' '-vvv' '-m' 'example commit message'
20:52:58.918467 run-command.c:626       trace: run_command: 'gpg' '--status-fd=2' '-bsau' '23810377252EF4C2'
error: gpg failed to sign the data
fatal: failed to write commit object

现在手动运行失败命令:

$ echo "dummy" | gpg -bsau 23810377252EF4C2
gpg: skipped "23810377252EF4C2": Unusable secret key
gpg: signing failed: Unusable secret key

原来我的钥匙过期了,这不是我的错。

其他回答

如果你不想处理brew来安装gpg,这似乎时不时会遇到问题,只需从gpg tools下载gpg工具。

在执行向导时,单击customize install并取消选择邮件插件(除非您想使用它)。这些工具似乎没有遇到任何问题,而且它会在你第一次签署提交后记住你的密码。不需要额外的配置,除了告诉git使用哪个键。

至少这是我的经验。

我也遇到了同样的问题。我很高兴地报告,问题不在于git 2.10.0,而在于gnupg 1.4.21。

暂时将gnupg降级到1.4.20为我解决了这个问题。

如果你正在使用自制程序,并且像我一样升级了你的包,你可能只需要运行brew开关gnupg 1.4.20来恢复。

经过大量搜索,我发现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

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

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

在prezto的另一个zsh变体中遇到了这个。那里的问题是我的git回购是新的,没有node_modules添加到.gitignore。当我将node_modules添加到.gitignore时,问题就没有了。所以我的假设是git-info由于这些大的node_module而花费时间。