git commit签名失败:密钥不可用


83

尝试使用Git提交时出现此错误。

gpg: skipped "name <name@mail.com>": secret key not available
gpg: signing failed: secret key not available
error: gpg failed to sign the data
fatal: failed to write commit object

我生成了一个新的密钥,如下所示,但它仍然给出相同的错误

gpg --list-keys
~/.gnupg/pubring.gpg
--------------------------------
pub   2048R/35F5FFB2 2016-04-23
uid                  name (New key) <name@mail.com>
sub   2048R/112A8C2D 2016-04-23

密钥与上面相同

我已经找到了 生成用于git标记的GPG密钥并按照以下步骤进行操作,但仍然无法正常工作,知道吗?


3
对于Windows用户,更有可能遇到此错误,因为Windows上的Git没有使用正确的gpg。git在PATH中找不到正确的二进制文件,而git则在其缩小的MSYS中使用内部捆绑的gpg,该MSYS不知道您的键在哪里。设置gpg.program或G(NU)PGHOME变量将解决该问题,如下面的一些答案所述。
张亚伯

Answers:


77

您需要先配置密钥,然后再使用它。

git config user.signingkey 35F5FFB2

如果要对每个存储库使用相同的密钥,请全局声明它。

git config --global user.signingkey 35F5FFB2

资料来源:Git工具-签署工作


非常感谢Leonardo!有用!!抱歉,这个问题很愚蠢,我不知道该如何解决。
EmilioMenéndez'16

优秀!指定用户的签名密钥也可以避免在一个密钥上有多个电子邮件地址,并且git电子邮件和密钥上的第一个地址不匹配。
user2943160 2013年

1
将.gitconfig和密钥存储在公共仓库中是否安全?
melihovv

1
@melihovv询问有关记录的信息:—密钥必须在您的GPG密钥环上。仅该键的哈希ID存储在配置中。
BRPocock

2
我必须和一起做git config --global gpg.program gpg2
Splaktar

108

这在Windows 10上对我有用(请注意,我使用gpg.exe的绝对路径):

git config --global gpg.program "C:\Program Files (x86)\GnuPG\bin\gpg.exe"

这是我在修复之前遇到的错误:

gpg: skipped "3E81C*******": secret key not available
gpg: signing failed: secret key not available
error: gpg failed to sign the data
fatal: failed to write commit object

2
secret key not availableVS Code出现此错误,设置gpg.exe位置解决了该错误。
戴维

2
这也为我工作。特别是在遵循github本身的配置步骤之后。
巴斯G

1
每次安装Windows Insider构建时,此选项都会重置。谢谢你:)
VRG

添加gpg的绝对路径后,这对我也有效。非常感谢。
Adarsh Srivastava

64

对我有用的是添加

git config --global gpg.program "C:/Program Files (x86)/GNU/GnuPG/gpg2.exe"

如果要查找gpg2.exe的完整路径,请执行以下操作:

where gpg2.exe

3
根据安装的GnuPG版本,您需要这样做gpg.exe而不是gpg2.exe
Mark Rotteveel

14

我想完成所有这些答案,因为与此相关的问题很多。

这些示例使用该--global标志,但是如果您想在本地处理这些事情,则可以将其删除。

在git中配置密钥

git config --global user.signingkey 35F5FFB2

在git中配置女巫gpg程序tu使用(可选)

某些系统(例如,Ubuntu)可以同时具有gpggpg2。您需要指定要使用的gpg2

git config --global gpg.program gpg2

导出GPG_TTY(可选)

如果在ssh环境中使用这些命令,可能会出现以下错误:Inappropriate ioctl for devicegpg: échec de la signature : Ioctl() inapproprié pour un périphérique。可以通过以下方法解决:

export GPG_TTY=$(tty)

自动启用GPG唱歌(可选)

git config --global commit.gpgsign true

如果您不想再使用它,如何禁用它?
Madona Syombua

1
您可以--unset在这些git config命令上添加标记以将其禁用
alphayax

我实际上使用了这个git config --global commit.gpgsign true,但是说false。
Madona Syombua,

7

我遇到的情况是,在一台Windows 10计算机上发生了同样的事情。

$ git commit -m "Improve logging, imports and show time executed"
gpg: signing failed: Operation cancelled
gpg: signing failed: Operation cancelled
error: gpg failed to sign the data
fatal: failed to write commit object

命令"C:\Program Files (x86)\GnuPG\bin\gpg.exe" --list-secret-keys --keyid-format LONGgpg --list-secret-keys --keyid-format LONG给我的地方会得到不同的结果!

$ where gpg
C:\Program Files\Git\usr\bin\gpg.exe
C:\Program Files (x86)\GnuPG\bin\gpg.exe

主要原因与先前的答案有关,但意义不同:

  • 我正在使用GPG的git(配置路径)版本创建gpg密钥
  • Git已配置为使用下载的gpg版本进行提交。
  • 似乎GPG实现使用自己的证书数据库和存储。

希望这对遇到此消息的人有所帮助,并且以前的回答不能解决您的问题。


必须从cli导出中为kleopatra添加密钥,因为Visual Studio社区似乎默认使用该密钥进行签名,而git cli使用不同的列表/实现,因此在没有kleopatra的情况下仍然可以使用。
Nithish

5

您必须设置变量GNUPGHOME。没有它,GnuPG无法找到您的密钥。

# On unix add it to your path

# On windows it will usually be under: 
<drive>:\Users\<username>\AppData\Roaming\gnupg

在Unix上,它只是将其添加到路径中。
在Windows上,您必须打开控制面板并将其设置为

System Variable
  Name: GNUPGHOME
  Path: <drive>:\Users\<username>\AppData\Roaming\gnupg

1
对我来说不是GNUPGHOME。有了GPGHOME它为我的作品
Sysix

1

我有一个相同的问题,那就是.gitconfig中的git名称和电子邮件存储与所提供的gpg密钥不同。我更改了它们以匹配,它开始起作用。


0

使用"C:\Program Files\Git\usr\bin\gpg.exe"是我的解决方案。
不得不卸载kleopatra。有了它,它不起作用。

因此,总结一下;

  • 不需要kleopatra,请改用GIT默认值。

  • git config --global user.signingkey Y0URK3Y
    git config --global commit.gpgsign true
    git config --global gpg.program "C:\Program Files\Git\usr\bin\gpg.exe"
    

-4

也许您需要在拥有权限的地方克隆自己的存储库。克隆另一个人的存储库时遇到了这个问题。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.