【问题标题】:gpg failed to sign the data fatal: failed to write commit object [Git 2.10.0]gpg 未能签署数据致命:未能写入提交对象 [Git 2.10.0]
【发布时间】:2017-01-22 12:10:26
【问题描述】:

我在Git 2.10 发行说明上关注了几篇关于pretty 属性的文章。通过将 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 位 RSA 密钥,ID AAAAAAAA,创建于 2016-07-01

错误:gpg 未能签署数据致命:未能写入提交 对象

注意 - 我仍然可以使用 git commit -a -m "message"

提交更改

有没有办法克服同样的问题?或者gpg configs 需要进行任何更改以配合 git 的升级?


更新 1

还寻求进一步的用处,关注Is there a way to "autosign" commits in Git with a GPG key?。我已经使用

配置了密钥
git config --global user.signingkey ED5CDE14(with my key) 
git config --global commit.gpgsign true

而且很明显还是会遇到同样的错误。

【问题讨论】:

  • 我面临类似的问题。我在 Windows 上卸载了 Git 2.8 (git-scm)。并安装了2.10。现在我每次使用-S 都会得到gpg failed to sign the data。在 2.8 中,我可以毫无问题地签署提交。我不知道会发生什么。
  • 添加 user.signingkey 解决了我的问题,很奇怪。
  • 具有讽刺意味的是,我改变了我的机器以重新设置东西并最终寻找我自己的问题,并且建议的解决方案对我来说都不够干净,无法简单地开始。
  • 试试gpgconf --kill gpg-agentas discussed here
  • 确保git config --get-all user.namegit config --get-all user.email与签名使用的key相同,可以通过gpg -K --keyid-format SHORT查看

标签: git github gpg-signature


【解决方案1】:

2016 年 10 月更新:issue 871 确实提到“签名在 Git 2.9.3 中停止工作”

两天前(2016 年 10 月 4 日)发布的Git for Windows 2.10.1 修复了提交和标签的交互式 GPG 签名。

git 中最近的 gpg-sign 更改(在 Linux 上没有引入任何问题)暴露了一个问题,即在 Windows 上,非 MSYS2-git 与 MSYS2-gpg 交互的方式存在问题。


原答案:

阅读“7.4 Git Tools - Signing Your Work”,我假设您已经设置了“user.signingkey”配置。

围绕 gpg 的最后一次重大重构(在 Git 2.10 之前)是在 commit 2f47eae2a,此处错误消息已移至 gpg-interface.c

该文件上的日志显示 commit af2b21e (Git 2.10) 中的最新更改

gpg2 默认已经使用长格式,但由于兼容性原因,大多数发行版似乎仍然将“gpg”作为较旧的 1.x 版本。而且老版本的 gpg 只显示 32 位的短 ID,这是相当不安全的。

这实际上对验证本身并不重要:如果 验证通过,pgp签名良好。
但如果你不 实际上还有密钥,并且想要获取它,或者您想要检查 究竟是哪个密钥用于验证并想要检查它,我们 应该更精确地指定密钥。

因此请检查您如何指定 user.signingkey 配置,以及您使用的 gpg 版本(gpg1 或 gpg2),看看这些是否对错误消息有任何影响。

还有commit 0581b54 改变了gpg failed to sign the data 错误消息的条件(作为commit 0d2b664 的补充):

我们目前根本不从 stderr 读取。但是,我们希望在未来的补丁中,所以这也为我们做好了准备(在这种情况下,gpg 确实在读取所有输入之前写入,但同样,密钥 uid 不太可能填满管道缓冲区)。

Commit 4322353 显示 gpg 现在使用临时文件,因此可能存在正确的问题。

让我们转换为使用临时文件对象,它处理 对我们来说很困难的情况,并添加缺少的清理调用。

【讨论】:

  • 我确实有我的user.signingkey 配置集。也使用gpg (GnuPG) 2.0.3
  • @nullpointer 我已经编辑了我的答案。您能否检查 Gti For Windows 2.10.1 是否仍然存在问题。
  • 抱歉更新晚了,在 MacOSX 而不是 Windows 上工作,所以无法验证这一点。
  • Windows 用户的另一个潜在问题是他们是否在 git 附带的 gnupg 版本之外安装了 gnupg -- gpg --list-keys 不会提供与 "C:\Program Files\Git\usr\bin\gpg.exe" --list-keys 相同的输出,因此,git尝试签署提交时找不到您的密钥,因为它使用了“错误”gpg
  • @sytech 对,我记得在这里也必须这样做:stackoverflow.com/a/61849206/6309
【解决方案2】:

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

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

如果您使用自制软件并且像我一样升级了软件包,您可能只需运行 brew switch gnupg 1.4.20 即可恢复。

【讨论】:

    【解决方案3】:

    我在 OSX 上遇到了这个问题。

    原答案:

    似乎 gpg 更新(brew)将位置 gpg 更改为 gpg1,您可以更改 git 查找 gpg 的二进制文件:

    git config --global gpg.program gpg1
    

    如果您没有 gpg1:brew install gpg1

    更新答案:

    gpg1 似乎已被弃用/"gently nudged out of usage",因此您可能实际上应该更新到 gpg2,不幸的是,这涉及更多步骤/一些时间:

    brew upgrade gnupg  # This has a make step which takes a while
    brew link --overwrite gnupg
    brew install pinentry-mac
    

    关于旧自制软件:

    echo "pinentry-program /usr/local/bin/pinentry-mac" >> ~/.gnupg/gpg-agent.conf
    killall gpg-agent
    

    在最近的 M1 mac 上:

    echo "pinentry-program /opt/homebrew/bin/pinentry-mac" >> ~/.gnupg/gpg-agent.conf 
    killall gpg-agent
    

    前半部分安装gpg2,后半部分是a hack required to use it。有关故障排除,请参阅this answer(虽然那是关于 linux 而不是 brew),它建议一个很好的测试:

    echo "test" | gpg --clearsign  # on linux it's gpg2 but brew stays as gpg
    

    如果此测试成功(没有错误/输出包含 PGP 签名),则您已成功更新到最新的 gpg 版本。

    您现在应该可以再次使用 git 签名了!
    值得注意的是,您需要:

    git config --global gpg.program gpg  # perhaps you had this already? On linux maybe gpg2
    git config --global commit.gpgsign true  # if you want to sign every commit
    

    注意:运行签名提交后,您可以验证它是否已签名:

    git log --show-signature -1
    

    这将包括最后一次提交的 gpg 信息。

    【讨论】:

    • 将 gpg.program 设置为 /usr/local/bin/gpg(没有“1”)为我修复了它。
    • 似乎gnupg2 的更新与brew 混淆了符号链接,因此删除了gpg,我使用brew link --overwrite gnupg2 修复了链接。
    • 嗯...不起作用。登录 xcode 时仍然报错。
    • killall gpg-agent &amp;&amp; gpg-agent --daemon --use-standard-socket --pinentry-program /usr/local/bin/pinentry 终于帮我修好了
    • 它只在我使用短 ID git config --global user.signingkey &lt;short Key ID&gt; ?时对我有用。
    【解决方案4】:

    以上答案似乎都不符合我的问题。我的 gpg 二进制文件 (/usr/local/bin/gpg -&gt; /usr/local/MacGPG2/bin/gpg2) 是作为 GPG Suite 的一部分安装的,而不是通过 brew 安装的。

    尽管如此,我觉得建议归结为:“使用 brew 上最新可用的 gpg 二进制文件”。所以我尝试了:

    brew update
    brew upgrade git
    brew install gpg
    
    # the following are suggestions from brew's Caveats, to make `/usr/local/bin/gpg`
    # point to the brew binary:
    rm '/usr/local/bin/gpg'
    brew link --overwrite gnupg2
    

    我确认我已正确更改了 $PATH 上的 gpg 以指向来自 brew 的新可执行文件:

    ? which gpg
    /usr/local/bin/gpg
    ? ls -l /usr/local/bin/gpg
    lrwxr-xr-x  1 burger  admin  33 Feb 13 13:22 /usr/local/bin/gpg -> ../Cellar/gnupg2/2.0.30_3/bin/gpg
    

    我还明确告诉 git 使用哪个 gpg 二进制文件:

    git config --global gpg.program gpg
    

    好吧,也许这不是完全无懈可击的,因为它对路径很敏感。实际上,我并没有完全确认 git 已切换到调用 brew gpg

    无论如何:这些都不足以让git commit 再次成功签署我的提交。


    最终对我有用的是更新 GPG Suite。我运行的是 2016.7 版本,我发现更新到 2016.10 解决了我的问题。

    我打开GPG Keychain.app,然后点击“检查更新...”。使用新版本:签名提交再次正常工作。

    【讨论】:

    • 我尝试更新到最新版本……但也没有用。正在尝试登录 xcode。
    【解决方案5】:

    如果使用gnupg2和gpg-agent 2.x,请务必设置环境变量GPG_TTY

    export GPG_TTY=$(tty)
    

    GPG’s documentation about common problems

    【讨论】:

    • 如果使用fish,请在您的个人资料中添加set -x GPG_TTY (tty)
    • 我将变量添加到~/.zshrc 并且我可以再次提交,现在它已正确连接到终端。感谢您的所有帮助!
    • 这是我在 WSL2 中所需要的。
    • zsh 启用了即时提示的 Powerlevel10k 用户请注意,您最终可能会得到 not a tty 值:unix.stackexchange.com/a/608921/5095。一个快速的解决方法是使用更快、更安全的方法(在 Zsh 的上下文中):export GPG_TTY=$TTY.
    • @Igor Klimer 你是个救命稻草,刚好在第一个谷歌上看到你的评论
    【解决方案6】:

    确保您的电子邮件设置正确。

    git config --global user.email "user@example.com"
    

    【讨论】:

    • 这是唯一对我有用的解决方案,有助于遵循通过github生成 GPG 密钥的正确方法
    • 在我的情况下,问题是我在特定的仓库中使用了公司电子邮件,而我没有为其生成 PGP 密钥。
    【解决方案7】:

    我在使用最新的 Git 源 (2.12.2) 以及所有依赖项的最新源(Zlib、Bzip、cURL、PCRE、ReadLine、IDN2、iConv、Unistring 等)构建时遇到了类似的问题。

    原来libreadline 给 GnuPG 带来了问题:

    $ gpg --version
    gpg: symbol lookup error: /usr/local/lib/libreadline.so.7: undefined symbol: UP
    

    当然,尝试使用 -vvv 从 Git 获取有用信息失败了,所以失败是个谜。

    要解决由于 ReadLine 导致的 PGP 失败,请按照Can't update or use package manager -- gpg error 的说明进行操作:

    在终端:

    ls /usr/local/lib
    

    那里有一堆 readline 库 (libreadline.so.BLAH-BLAH) 所以我:

    su
    mkdir temp
    mv /usr/local/lib/libreadline* temp
    ldconfig
    

    【讨论】:

      【解决方案8】:

      如果这只是随机发生并且过去一直运行良好,就像我的情况一样,请尝试注销 (cmd+shift+q) 并重新登录。为我工作

      【讨论】:

        【解决方案9】:

        可能有助于杀死可能卡在旧数据中的进程gpg-agent。所以新的gpg-agentstarted 会要求输入密码。

        【讨论】:

        • 使用gpg-agent --daemon启动它
        • 我也不得不重启 gpg-agent
        • 在 macOS 上杀死进程:killall gpg-agent
        • 在ubuntu上gpgconf --kill gpg-agent
        • 对于 Mac 用户:一旦 gpg-agent 被杀死,运行 commit 命令会要求输入密码 .. 为了不再重复相同的步骤,请确保将密码添加到 mac 钥匙串
        【解决方案10】:

        如果与您的 GPG 密钥的 uid 关联的电子邮件与您在 git 中使用的电子邮件不同,您需要向您的密钥添加另一个用户 ID 或使用与电子邮件完全匹配的密钥。

        您可以使用以下方法添加另一个 UID:

        $ gpg --edit-key

        https://superuser.com/questions/293184/one-gnupg-pgp-key-pair-two-emails

        【讨论】:

          【解决方案11】:

          我已经通过这个shorteasy食谱DONE做到了:

          ma​​cOS 上的自动签名提交(全局和使用不同的 IDE):

          this way 中获取您的signingkey

          brew install gnupg gnupg2 pinentry-mac
          git config --global user.signingkey <YOUR_SIGNING_KEY>
          git config --global commit.gpgsign true
          git config --global gpg.program gpg
          

          将以下内容放入gpg.conf 文件中(使用nano ~/.gnupg/gpg.conf 命令编辑文件):

          no-tty
          

          将以下内容放入gpg-agent.conf 文件中(使用nano ~/.gnupg/gpg-agent.conf 命令编辑文件):

          pinentry-program /usr/local/bin/pinentry-mac
          

          更新

          根据 cmets,您可能需要在编辑配置文件 gpg.conf 后执行 killall gpg-agent 命令。正如不言自明的命令所说,此命令将终止 GPG(Gnu Privacy Guard)代理。

          【讨论】:

          • 你能解释一下这些命令在做什么吗?这将有助于理解。
          • 我还必须在设置配置文件后运行killall gpg-agent,然后它就起作用了!
          • 我们怎么知道我们可以信任pinentry-mac 背后的人?我并不是说我们不能,但是 GPGTools 组织是由一个非常小的团队支持的,并且该 repo 只有 5 个贡献者,而使用 brew install gnupg,它利用了 gnupg.org 的工作。
          • 如果它对其他人有帮助,我的问题是我设置了无效的本地 user.signingkey,我在 sourcetree 配置和全局设置中都没有注意到(因为我没有想到查看本地配置)确保本地(git config --local --get user.signingkey)和全局(git config --global --get user.signingkey)相同,或者更好的是,如果本地配置无效,请取消设置(git config --local --unset user.signingkey
          • 在带有原生 brew 的 Apple Silicon 上,pinentry-mac 的路径将是 /opt/homebrew/bin/pinentry-mac
          【解决方案12】:

          使用cygwin,我最近切换到gpg2。然后我在设置git config gpg.program gpg2后用git签名也遇到了同样的问题。

          尝试echo "test" | gpg2 --clearsign 看看 gpg2 是否正常工作。我发现设置git config gpg.program gpg 是最简单的解决方案,因为它有效。但是这样你也会得到一个更好的错误 - 例如你需要安装pinentry。

          【讨论】:

          【解决方案13】:

          如果一切都失败了,使用GIT_TRACE=1 试试看 git 到底在做什么:

          $ GIT_TRACE=1 git commit -m "Add page that always requires a logged-in user"
          20:52:58.902766 git.c:328               trace: built-in: git 'commit' '-vvv' '-m' 'Add page that always requires a logged-in user'
          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
          

          现在手动运行失败的命令:

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

          原来,我的密钥已过期,git 不应该受到责备。

          【讨论】:

          • 这实际上帮助我解决了我自己的问题,并且它是针对此状态消息的所有类型问题的解决方案。 +1
          • 谢谢!这导致了我的问题。奇怪的是,我的本地 .git/config 在一个项目中指定的 name 与我的签名电子邮件不匹配。这足以拒绝它。
          • 好吧,在我的机器上执行gpg -bsau &lt;key&gt; 不会执行任何操作。这是否假设执行时间太长?或者这是否意味着密钥可以使用? @VonC 有什么见解吗?
          • 我收到secret key not available
          • 如果您的密钥已过期,您可以按照此处的说明进行更新:stackoverflow.com/a/43728576/2635190
          【解决方案14】:

          上面的答案很好,但它们对我不起作用。解决我的问题的方法是导出 publicsecret 密钥。

          列出我们从中导出的机器上的密钥

          $ gpg --list-keys
          /home/user/.gnupg/pubring.gpg
          --------------------------------
          pub 1024D/ABCDFE01 2008-04-13
          uid firstname lastname (description) <email@example.com>
          sub 2048g/DEFABC01 2008-04-13
          

          导出密钥

          $ gpg --output mygpgkey_pub.gpg --armor --export ABCDFE01
          $ gpg --output mygpgkey_sec.gpg --armor --export-secret-key ABCDFE01
          

          转到我们要导入的机器并导入

          $ gpg --import ~/mygpgkey_pub.gpg
          $ gpg --allow-secret-key-import --import ~/mygpgkey_sec.gpg
          

          宾果邦戈,大功告成!

          参考:https://www.debuntu.org/how-to-importexport-gpg-key-pair/

          ps。我的密钥最初是在 bootcamp windows 7 上制作的,然后我将它们导出到我的 mac air(相同的物理机器,虚拟不同)

          【讨论】:

            【解决方案15】:

            简单地设置它:

            brew uninstall gpg 
            
            brew install gpg2
            

            【讨论】:

              【解决方案16】:

              使用以下命令检查 gpg 是否启用

              git config -l | grep gpg
              

              如果返回true,运行以下命令禁用它

              git config --global --unset commit.gpgsign
              

              以上命令运行成功后,应该可以运行git commit命令了。

              【讨论】:

              • 这会禁用所有 GPG 签名而不修复问题。
              【解决方案17】:

              就我而言,其他答案中提到的解决方案均无效。我发现问题是特定于一个存储库的。再次删除和克隆 repo 解决了这个问题。

              【讨论】:

                【解决方案18】:

                我的两分钱在这里:

                当您创建并向 gpg-agent 添加密钥时,您定义了一个名为 passphrase 的东西。现在 passphrase 在某个时候过期,gpg 需要您再次输入它来解锁您的密钥,以便您可以重新开始签名。

                当您使用与gpg 交互的任何其他程序时,gpg 提示您输入密码的提示确实不会出现(基本上gpg-agent 守护进程不可能向您显示stdin 中的输入对话框)。

                其中一种解决方案是gpg --sign a_file.txt,然后输入您在创建密钥时输入的密码,然后一切都应该没问题(gpg-agent 应该会自动签名)

                请参阅this answer,了解如何为您的密码设置更长的超时时间,这样您就不必一直这样做了。

                或者您可以使用ssh-keygen -p 完全删除密码

                编辑:做一个man gpg-agent 阅读一些关于如何自动发生上述情况的内容并添加行

                GPG_TTY=$(tty)
                export GPG_TTY
                

                在您的 .bashrc 上,如果您使用的是 bash(这是正确的答案,但我的思路也在上面),然后获取您的 .bashrc 文件或重新登录。

                【讨论】:

                  【解决方案19】:

                  非常像@birchlabs,经过大量挖掘/搜索后,我发现它不是 GPG,而是 GPG Suite。我做了cask reinstall gpg-suite,它为我解决了这个问题。

                  【讨论】:

                    【解决方案20】:

                    git trace 对我的情况非常有启发性......

                       GIT_TRACE=1 git commit -m "a commit message"
                    
                       13:45:39.940081 git.c:344               trace: built-in: git commit -m 'a commit message'
                       13:45:39.977999 run-command.c:640       trace: run_command: gpg --status-fd=2 -bsau 'full name <your-email@domain.com>'
                       error: gpg failed to sign the data
                       fatal: failed to write commit object
                    

                    我需要根据git 检查的格式生成一个初始密钥。最好将传递给上面-bsau的值原样复制到日志中并在下面使用。

                    原来如此,

                       gpg --quick-generate-key "full name <your-email@domain.com>"
                    

                    然后它起作用了。

                    希望对您有所帮助。

                    【讨论】:

                    • 伙计...您无法想象我花了多少时间试图解决这个问题,直到我得到您的答案...这一直是钥匙的命名...谢谢!谢谢!谢谢!
                    【解决方案21】:

                    我一定是不小心更新了 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 为我修复了它。

                    希望这对某人有所帮助。

                    【讨论】:

                      【解决方案22】:

                      可能是一个挂起的 gpg 代理。

                      试试gpgconf --kill gpg-agentas discussed here

                      【讨论】:

                        【解决方案23】:

                        对于在 MacOS 机器上遇到此问题的任何人,试试这个:

                        1. brew uninstall gpg
                        2. brew install gpg2
                        3. brew install pinentry-mac(如果需要)
                        4. gpg --full-generate-key 使用算法创建密钥。
                        5. 通过执行获取生成的密钥:gpg --list-keys
                        6. 在这里设置密钥git config --global user.signingkey &lt;Key from your list&gt;
                        7. git config --global gpg.program /usr/local/bin/gpg
                        8. git config --global commit.gpgsign true
                        9. 如果您想将您的密钥导出到 GitHub,那么:gpg --armor --export &lt;key&gt; 并在 GPG 密钥处将此密钥添加到 GitHub:https://github.com/settings/keys(包括 START 和 END 行)

                        如果问题仍然存在:

                        test -r ~/.bash_profile &amp;&amp; echo 'export GPG_TTY=$(tty)' &gt;&gt; ~/.bash_profile

                        echo 'export GPG_TTY=$(tty)' &gt;&gt; ~/.profile

                        如果问题仍然存在:

                        安装https://gpgtools.org 并通过按菜单栏中的Sign 对您使用的密钥进行签名:Key->Sign

                        如果问题仍然存在:

                        转到:‎您的全局 .gitconfig 文件,在我的情况下位于:‎/Users/gent/.gitconfig 并修改.gitconfig文件(请确保Email和Name与您在生成Key时创建的相同)

                        [user]
                        	email = gent@youremail.com
                        	name = Gent
                        	signingkey = <YOURKEY>
                        [gpg]
                        	program = /usr/local/bin/gpg
                        [commit]
                        	gpsign = true
                        	gpgsign = true
                        [filter "lfs"]
                        	process = git-lfs filter-process
                        	required = true
                        	clean = git-lfs clean -- %f
                        	smudge = git-lfs smudge -- %f
                        [credential]
                        	helper = osxkeychain

                        【讨论】:

                        • 在 .gitconfig 中添加 'gpsign = true' 为我修复了它
                        • 我必须运行 'gpg-agent --daemon' 并为我修复了它(OS X,brew)。
                        【解决方案24】:

                        按照以下网址设置签名提交 https://help.github.com/en/articles/telling-git-about-your-signing-key

                        如果仍然得到 gpg 未能签署数据致命: 未能写入提交对象

                        这不是 git 的问题,这是 GPG 的问题 请按照以下步骤操作

                        1. gpg --version
                        2. echo "test" | gpg --clearsign

                        如果显示:

                        gpg: signing failed: Inappropriate ioctl for device
                        gpg: [stdin]: clear-sign failed: Inappropriate ioctl for device
                        
                        
                        1. 然后使用export GPG_TTY=$(tty)

                        2. 然后再试一次echo "test" | gpg --clearsign 得到PGP签名的地方。

                        3. git config -l | grep gpg

                        gpg.program=gpg
                        commit.gpgsign=true
                        
                        1. 申请git commit -S -m "commitMsz"

                        【讨论】:

                        • export GPG_TTY=$(tty) 是诀窍。将其添加到我的 .zshrc 文件中
                        • Ubuntu 20.04 成功。谢谢!这不是提供export GPG_TTY=$(tty) 的第一个答案。这里的不同之处在于@jayesh 还提供了一个测试,并且没有关于 gpg2、fish 或 brew 的任何内容(?)与 Ubuntu 中的任何内容都无关。这也是一个更新的答案,就我的目的而言,这意味着此时此答案可能比几年前的答案更好。这篇简短、有效且最新的帖子做得很好。
                        • 我确认这适用于 WSL2!在 Git Bash 中我不需要做这个配置。 e. GUI自然出现。然而,在 WSL2 中,尽管通过 X 服务器获得了 GUI 支持,但如果没有 export GPG_TTY=$(tty),它就无法工作。这效果很好。
                        • export GPG_TTY=$(tty) 拯救了这一天!在Kali ARM 5.4.83-Re4son-v7l+gpg (GnuPG) 2.2.27 上确认。
                        • 拯救了我的一天(和一夜)。你能说出 export GPG_TTY=$(tty) 是什么意思吗?
                        【解决方案25】:

                        我在 Ubuntu 18.04 上遇到了同样的错误,也担心了好几个星期。 终于意识到 gpg2 没有指向任何东西。 所以只需运行

                        git config --global gpg.program gpg
                        

                        还有,它就像魅力一样。

                        您的提交现在将带有经过验证的标签。

                        【讨论】:

                          【解决方案26】:

                          我偶然发现此错误不是因为任何配置问题,而是因为我的密钥已过期。在 OSX 上扩展其有效性的最简单方法是打开 GPG Keychain 应用程序(如果您安装了它),它会自动提示您扩展它。两次点击,你就完成了。希望这对谷歌同事有所帮助:)

                          【讨论】:

                            【解决方案27】:

                            我在 Ubuntu 18.04 上遇到此错误,结果发现我的密钥已过期

                            为了看到这个,我运行了这个,它确认我的密钥已过期:

                            gpg --list-keys
                            

                            为了纠正这个问题,我运行了(使用上一个命令中显示的 ID):

                            gpg --edit-key <ID>
                            

                            从那里,我在these instructions 之后延长了key 0key 1 的到期时间,归结为输入key 0 然后expire 并按照提示操作。然后重复key 1

                            之后,为了测试这个,我跑了:

                            echo test | gpg --clearsign
                            

                            在修复之前,它失败并出现错误:

                            gpg:没有默认密钥:没有密钥
                            gpg: [stdin]: clear-sign failed: No secret key

                            但是在修复之后,同样的命令成功地签署了消息,所以我知道事情又恢复了!

                            【讨论】:

                            • 确认这一点解决了将有效密钥从 Mac OSX Catalina 导入 CentOS7 时出现的问题。与这只野兽战斗了两个多小时,试图弄清楚为什么它一直要求输入密码。奇怪的是它已经设置为永不过期,而我将它设置为仍然永不过期。
                            【解决方案28】:

                            我看到了类似的答案,但没有什么完全适合我的答案。在 Linux 上,我不得不杀死并重新启动我的gpg-agent

                            $ pkill gpg-agent
                            $ gpg-agent --daemon
                            $ git commit ...
                            

                            这对我有用。看起来您确实需要将 user.signingkey 设置为您的私钥以及其他一些 cmets 所说的。

                            $ git config --global user.signingkey [your_key_hash]
                            

                            【讨论】:

                            • 这在 MacOS 10.15.6 上对我有用,并且从 brew 安装了 gpg (GnuPG) 2.2.23。感谢您的提示!
                            【解决方案29】:

                            有点奇怪,但请确保您的终端足够大!你可以通过运行echo test | gpg --clearsign 来判断它是否太小——它会给你一个非常明显的错误消息让你知道。如果它不够大,您的 GPG 代理将无法显示它的小 ncurses 框。

                            如果您使用 GUI 代理或不使用 ncurses 的东西,则此选项不适用。

                            【讨论】:

                              【解决方案30】:

                              这对我来说是在 Ubuntu 上突然发生的,不确定最近是否有一些更新,但没有一个现有问题适用于我(我设置了 GPG_TTY,尝试杀死代理等)。独立的 gpg 命令失败并出现此错误:

                              $ echo "test" | gpg --clearsign
                              -----BEGIN PGP SIGNED MESSAGE-----
                              Hash: SHA512
                              
                              test
                              gpg: signing failed: Operation cancelled
                              gpg: [stdin]: clear-sign failed: Operation cancelled
                              

                              我尝试使用 --debug-all 选项运行 gpg 并注意到以下输出:

                              gpg: DBG: chan_3 <- INQUIRE PINENTRY_LAUNCHED 27472 gnome3 1.1.0 /dev/pts/6 screen-256color -
                              gpg: DBG: chan_3 -> END
                              gpg: DBG: chan_3 <- ERR 83886179 Operation cancelled <Pinentry>
                              gpg: signing failed: Operation cancelled
                              

                              以上表明pinentry 程序存在一些问题。 Gpg 通常为我运行pinentry-curses,所以我将其更改为pinentry-tty(我必须先aptitude install)并且错误消失了(虽然我不再获得全屏密码输入,但我不喜欢那样反正)。要进行此更改,我必须将行 pinentry-program /usr/bin/pinentry-tty 添加到 ~/.gnupg/gpg-agent.conf 并使用 gpgconf --kill gpg-agent 终止代理(它会在下一次重新启动)。

                              【讨论】:

                                猜你喜欢
                                • 2021-07-18
                                • 2021-05-12
                                • 1970-01-01
                                • 1970-01-01
                                • 2017-04-24
                                • 2017-05-21
                                • 1970-01-01
                                • 1970-01-01
                                • 2019-03-19
                                相关资源
                                最近更新 更多