我刚开始使用git,我通过自制软件安装git和gpg。 由于某种原因,当我提交git时,我得到了这个错误 我看了很多关于这个话题的stackoverflow问题,但没有一个对我有用。 如何修复此错误以成功上传?

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

当前回答

如果您使用智能卡/yubikey存储您的GPG密钥,并且您通过存储在卡中的密钥设置了git配置的signkey(并且上面所有的答案似乎都不能解决您的问题),您的卡的PIN被阻塞可能是这个问题的根本原因。

检查被阻止的PIN码:

gpg --card-status

如果计数器类似于

Reader ...........: Yubico YubiKey
PIN retry counter : 3 0 3

然后你的PIN被阻止(3次不成功尝试后)。

解锁密码:

gpg --card-edit
gpg/card> admin
Admin commands are allowed

gpg/card> passwd
gpg: OpenPGP card no. … detected

1 - change PIN
2 - unblock PIN
3 - change Admin PIN
4 - set the Reset Code
Q - quit

Your selection? 2
PIN unblocked and new PIN set.

1 - change PIN
2 - unblock PIN
3 - change Admin PIN
4 - set the Reset Code
Q - quit

Your selection? q

其他回答

我已经做了一个git密钥,有3个单独的密钥用于认证/签名/加密&密钥在未来显示过期(在正常工作几天后):

pub   rsa4096/4CD1E9DA 2017-04-26 [C] [expired: 2017-04-28]
      Key fingerprint = 4670 59C1 7592 08B8 7FA5  313B 2A42 B6A6 4CD1 E9DA
uid         [ expired] Stuart Cardall (GIT Development Keys) <xxxxxx>
sub   rsa4096/5195E715 2017-04-26 [E] [expired: 2019-04-26]
sub   rsa4096/DB74C297 2017-04-26 [S] [expired: 2019-04-26]
sub   rsa2048/A3913A3C 2017-04-28 [] [expired: never     ]

在不添加单独子键的情况下创建一个新键来解决问题。

这在ubuntu 18.04上对我有效

检查你的gpg密钥

gpg -K --keyid-format LONG

如果得到空白响应,则生成一个GPG密钥

gpg --generate-key

重新运行第一个命令,你应该得到一个输出:

sec   rsa3072/95A854E0593B3214 2019-05-06 [SC] [expires: 2021-05-05]
      AF2F7514568DC26B0EB97B9595A854E0593B74D8
uid                 [ultimate] yourname<your_email>
ssb   rsa3072/EFD326E6C611117C 2019-05-06 [E] [expires: 2021-05-05]

设置git签名密钥

git config --global user.signingkey 95A854E0593B3214

然后你就可以开始了!(——global是可选的)

或者,如果您不介意用ssh密钥签名

git config commit.gpgsign false

请注意,由于这里和这里的问题存在安全问题,不建议这样做

我正在使用它。它支持zsh和工作在Windows子系统Linux:

export GPG_TTY=$(tty)

其他用户已经确认以上是MacOS(例如Catalina 10.15.7)所需的唯一更改。对于mac,将以上内容添加到~/.zshrc。

在使用WSL2的Windows中的Linux容器中也可以工作。

对于故障排除,首先要尝试两件事:

运行gpg——version,并确保安装了GnuPG版本2+(而不是版本1) 执行echo "test" | GPG——clearsign命令,确认GPG本身在工作

如果一切看起来都没问题,接下来要尝试的一件事是:

运行brew install pinentry以确保您已经安装了用于密码短语输入的良好工具

如果在安装之后,你再次尝试git提交,仍然得到一个“failed to sign the data”错误,请执行:

执行gpgconf——kill gpg-agent命令杀死任何可能挂起的正在运行的代理


否则,运行一些基本步骤来检查你是否有一个正常工作的GnuPG环境:

执行gpg -K——keyid-format SHORT命令,检查至少有一个密钥对没有过期

如果输出显示你没有供GnuPG使用的密钥,你需要创建一个:

运行gpg——gen-key,让GnuPG引导您完成创建密钥对的步骤


如果你得到一个错误消息说“不合适的ioctl为设备”,这样做:

运行export GPG_TTY=$(tty)和/或将其添加到~/。Bashrc或~ /.bash_profile

经过大量搜索,我发现gpg密钥是我的情况下的问题。

如果您的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