【问题标题】:git commit signing failed: secret key not availablegit commit 签名失败:密钥不可用
【发布时间】:2016-04-23 11:54:18
【问题描述】:

我在尝试使用 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

秘钥同上

我找到了这个 Generating a GPG key for git tagging 并按照步骤操作,但仍然无法正常工作,知道吗?

【问题讨论】:

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

标签: git


【解决方案1】:

这在 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

【讨论】:

  • 使用 VS Code 遇到此错误 secret key not available 并设置 gpg.exe 位置解决了它。
  • 这对我也有用。尤其是在遵循github 本身的配置步骤之后。
  • 每次我的 Windows Insider 版本安装时,此选项都会重置。谢谢你:)
  • 添加gpg的绝对路径后,这对我也有用。非常感谢。
  • 是的,这很重要,因为 git 有自己的 gpg,大多数人会为 windows 安装 gpg 并通过 kleopatra 导入 priv 密钥,只有“main” gpg 知道密钥位置。很好的答案
【解决方案2】:

使用前需要配置秘钥。

git config user.signingkey 35F5FFB2

如果您想为每个存储库使用相同的密钥,或者全局声明它。

git config --global user.signingkey 35F5FFB2

来源: Git Tools - Signing Your Work

【讨论】:

  • 非常感谢莱昂纳多!有用!!对不起,如果这个问题很愚蠢,我不知道如何解决它。
  • 在公共仓库中存储带有密钥的 .gitconfig 是否安全?
  • 作为@melihovv 询问的记录:- 密钥必须在您的 GPG 密钥环上。只有该键的哈希 ID 存储在配置中。
  • 我必须和git config --global gpg.program gpg2一起这样做。
  • 我在 1.4.22 中得到了一个密码短语对话框,但在 v2 中没有。一旦我执行 git config --global gpg.program "C:/Program Files (x86)/GnuPG/bin/gpg.exe" 它就会中断并且我得到无密钥错误。怎么办?
【解决方案3】:

我最近发现了同样的secret key not available 错误,并且在此过程中发现了更多错误,例如未找到 GPG 代理。

在我的例子中,我希望提交签名并在 GitHub 上显示为已验证。

以下是让它在 Windows 10 x64 上运行的完整步骤:

安装 GPG

我使用winget 安装了 GPG 2.3.1,如下所示:

C:\> winget install GnuPG.GnuPG

验证:

C:\> gpg --version

生成 GPG 密钥

C:\> gpg --full-generate-key
  • 添加您的真实姓名和电子邮件,与GitHub帐户中使用的相同。

  • 密钥必须至少为 4096 位。

以 ASCII 装甲格式导出密钥

先列出关键:

C:\> gpg --list-secret-keys --keyid-format=long

sec rsa4096/[short-key] 2021-06-14 [SC]

然后导出:

C:\> gpg --armor --export [short-key]

复制包含 BEGIN/END 文本的密钥。

-----BEGIN PGP PUBLIC KEY BLOCK-----
[huge-ascii-key]
-----END PGP PUBLIC KEY BLOCK-----

将 GPG 装甲 ASCII 密钥添加到 GitHub 帐户

转到Profile > Settings > SSH and GPG keys > 新GPG密钥

或者请关注这些visual instructions

将 Git 配置为默认对所有提交进行签名

C:\> git config --global user.signingkey [short-key]
C:\> git config --global commit.gpgsign true
C:\> git config --global gpg.program "C:/Program Files (x86)/gnupg/bin/gpg"

为 GPG 代理设置 GPG 环境变量

检查 GPG 代理:

gpg-agent --version

设置环境变量:

GNUPGHOME=%USERPROFILE%\AppData\Roaming\gnupg

完成

生成的.gitconfig 的用户部分如下所示:

[user]
    name = Your Name
    email = your@email.com
    signingkey = [short-key]
[commit]
    gpgsign = true
[gpg]
    program = C:/Program Files (x86)/gnupg/bin/gpg

【讨论】:

【解决方案4】:

对我有用的是添加

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

如果要查找gpg2.exe的完整路径:

where gpg2.exe

【讨论】:

  • 根据安装的 GnuPG 版本,您需要为 gpg.exe 而不是 gpg2.exe 执行此操作。
  • 谢谢,我的问题已使用完整路径(即C:\Users\Me\AppData\Local\gnupg\bin\gpg.exe)解决了
【解决方案5】:

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

所以,总结一下;

  • 不需要 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"
    

【讨论】:

    【解决方案6】:

    我遇到过在 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
    

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

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

    我希望这可以帮助任何偶然发现此消息并且以前的答案不能解决问题的人。

    【讨论】:

    • 必须从 cli 导出中将密钥添加到 kleopatra,因为 Visual Studio 社区似乎默认使用它进行签名,而 git cli 使用不同的列表/实现,因此仍然可以在没有克娄巴特拉。
    • 我从C:\Users\USERNAME\.gnupg复制了所有内容到C:\Users\USERNAME\AppData\Roaming\gnupg,问题解决了!
    【解决方案7】:

    我想完成所有这些答案,因为我有很多问题。

    这些示例使用--global 标志,但如果您想在本地使用这些东西,可以将其删除。

    在 git 中配置密钥

    git config --global user.signingkey 35F5FFB2
    

    配置git中使用的witch gpg程序(可选)

    有些系统(例如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
    

    【讨论】:

    • 如果您不再想使用它,如何禁用它?
    • 您可以在git config 命令上添加--unset 标志来禁用它
    • 我其实用过这个 git config --global commit.gpgsign true 但是说的是 false。
    【解决方案8】:

    您必须设置变量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
    

    【讨论】:

    • 对我来说不是GNUPGHOMEGPGHOME 对我有用
    【解决方案9】:

    我遇到了同样的问题,即 .gitconfig 中的 git name 和 email 存储与提供的 gpg 密钥不同。我改变了它们以匹配它并开始工作。

    【讨论】:

      【解决方案10】:

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

      【讨论】:

        猜你喜欢
        • 2016-06-16
        • 1970-01-01
        • 1970-01-01
        • 2018-08-29
        • 2015-11-17
        • 1970-01-01
        • 2018-11-18
        • 2017-08-20
        • 1970-01-01
        相关资源
        最近更新 更多