ChatGPT解决这个技术问题 Extra ChatGPT

gpg 未能签署数据致命:未能写入提交对象 [Git 2.10.0]

我关注了几篇关于 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 配置进行任何更改以配合 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-agent as discussed here
确保 git config --get-all user.namegit config --get-all user.email 与用于签名的密钥相同,可以通过 gpg -K --keyid-format SHORT 检查

D
DV82XL

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

原答案:

似乎 gpg 更新(brew)更改为 gpggpg1 的位置,您可以更改 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 macs 等更新的系统上:

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”)为我修复了它。
嗯……不行。在登录 xcode 时仍然出现我的错误。
killall gpg-agent && gpg-agent --daemon --use-standard-socket --pinentry-program /usr/local/bin/pinentry 终于为我修好了
仅当我使用短 ID git config --global user.signingkey <short Key ID> 😖 时,它才对我有用。
在 M1 mac 上,该行应该是 echo "pinentry-program /opt/homebrew/bin/pinentry-mac" >> ~/.gnupg/gpg-agent.conf
K
Koraktor

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

export GPG_TTY=$(tty)

请参阅GPG’s documentation about common problems


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

如果一切都失败了,请使用 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 <key> 不会执行任何操作。这是否假设执行时间太长?或者这是否意味着密钥可以使用? @VonC 有什么见解吗?
如果您的密钥已过期,您可以按照此处的说明进行更新:stackoverflow.com/a/43728576/2635190
这是唯一正确的答案。最好知道发生了什么,而不是盲目地尝试一百万种不同的可能解决方案
e
erhun

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

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

这不是 git 的问题,这是 GPG 遵循以下步骤

gpg --version echo "测试" | gpg --clearsign

如果显示:

gpg: signing failed: Inappropriate ioctl for device
gpg: [stdin]: clear-sign failed: Inappropriate ioctl for device

然后使用 export GPG_TTY=$(tty) 然后再次尝试 echo "test" | gpg --clearsign 获取 PGP 签名。混帐配置-l | grep gpg

gpg.program=gpg
commit.gpgsign=true

应用 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 中我不需要做这个配置,即 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) 是什么意思吗?
S
Shayan Amani

我已经通过这个简短而简单的食谱做到了:

macOS 上的自动签名提交(全局和使用不同的 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

更新:

正如评论中所建议的,根据评论,您可能需要在编辑配置文件 gpg.conf 后执行 killall gpg-agent 命令。不用说这个命令会终止 GPG(Gnu Privacy Guard)代理。


你能解释一下这些命令在做什么吗?这将有助于理解。
设置配置文件后,我还必须运行 killall gpg-agent,然后它就起作用了!
我们怎么知道我们可以信任 pinentry-mac 背后的人?我并不是说我们不能,但是 GPGTools 组织是由一个非常小的团队支持的,并且该 repo 只有 5 个贡献者,而使用 brew install gnupg,它利用了 gnupg.org 的工作。
如果它对其他人有帮助,我的问题是我有一个无效的本地 user.signingkey 集,我在我的源树配置中没有注意到,也没有在我的全局设置中注意到(因为我没有考虑查看本地配置)确保两者本地 (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
N
Naman

可能有助于终止可能卡住旧数据的进程 gpg-agent。所以新的gpg-agent开始会要求输入密码。


使用 gpg-agent --daemon 启动它
我也必须重新启动 gpg-agent
要在 macOS 上终止进程:killall gpg-agent
在 Ubuntu gpgconf --kill gpg-agent
这对我来说非常有效。谢谢马克西姆科斯特里金。
G
George Daramouskas

我的两分钱在这里:

当您创建并向 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 文件或重新登录。


G
Gent

对于在 MacOS 机器上遇到此问题的任何人,请尝试以下操作:

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

如果问题仍然存在:

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

echo 'export GPG_TTY=$(tty)' >> ~/.profile

如果问题仍然存在:

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

如果问题仍然存在:

转到:‎您的全局 .gitconfig 文件,在我的情况下位于:‎/Users/gent/.gitconfig 并修改 .gitconfig 文件 (请确保电子邮件和名称与您在生成密钥时创建的那个)

[用户] 电子邮件 = gent@youremail.com 名称 = Gent 签名密钥 = [gpg] 程序 = /usr/local/bin/gpg [commit] gpsign = true gpgsign = true [过滤器“lfs”] 进程 = git-需要 lfs 过滤器进程 = true clean = git-lfs clean -- %f smudge = git-lfs smudge -- %f [credential] helper = osxkeychain


在 .gitconfig 中添加 'gpsign = true' 为我修复了它
我必须运行'gpg-agent --daemon'并为我修复它(OS X,brew)。
E
Engineero

我见过类似的答案,但与对我有用的完全不同。在 Linux 上,我必须使用以下命令终止并重新启动我的 gpg-agent

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

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

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

这在 MacOS 10.15.6 上对我有用,并且从 brew 安装了 gpg (GnuPG) 2.2.23。谢谢你的提示!
t
trainoasis

在 OS X 上,通过 brew 使用 gnupg2 我只需要杀死 gpg 代理,有时会发生:

pkill -9 gpg-agent

并根据需要设置 env 变量:

export GPG_TTY=$(tty)

另见Common GPG problemsthis answer here too.


这也对我有用。我创建了一个新别名 alias fix-gpg='pkill -9 gpg-agent && export GPG_TTY=$(tty)'
这工作正常,谢谢。之后甚至不需要设置 env 变量。
重新安装 python 后,我不得不杀死 gpg 代理。之后它开始工作。
M
Muhammad Dyas Yaskur

每次注销然后在我的 macOS 上再次登录时,我都会收到该错误。解决方案只是一个简单的命令:

killall gpg-agent

我认为这只是 gpg 代理的错误,杀死它然后再次工作。


谢谢。那行得通!
M
Muhammad Dyas Yaskur

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>"

然后它起作用了。


伙计……你无法想象我花了多少时间试图解决这个问题,直到我得到你的答案……这一直是钥匙的命名……谢谢!谢谢你!谢谢你!
K
Koraktor

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 确实在读取所有输入之前写入,但同样,key 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
l
lucidbrot

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

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


实际上,在某些 Linux 发行版上,您最终可能会遇到同样的问题。 Git 总是使用 gpg,而不是 gpg2。另请参阅:stackoverflow.com/questions/34766123/…
这为我揭示了可以通过 export GPG_TTY=$(tty) 解决的错误 gpg: signing failed: Inappropriate ioctl for device。来源:github.com/keybase/keybase-issues/issues/2798
L
Lounge9

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

试试 gpgconf --kill gpg-agent as discussed here


g
gMale

我在 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]:清除签名失败:没有密钥

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


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

如果您在没有 Rosetta 的 M1 芯片上使用自制软件,则需要指定 pinentry-program 二进制文件的不同位置,因为它安装在不同的位置。

安迪海登的更新答案应修改如下:

brew upgrade gnupg  # This has a make step which takes a while
arch -arm64 brew link --overwrite gnupg
arch -arm64 brew install pinentry-mac
echo "pinentry-program /opt/homebrew/bin/pinentry-mac" >> ~/.gnupg/gpg-agent.conf
killall gpg-agent

由于某种原因,我的 M1 上的签名停止工作:echo "test" | gpg --clearsign 输出为 gpg: signing failed: Inappropriate ioctl for device gpg: [stdin]: clear-sign failed: Inappropriate ioctl for device。这对我有用。
唯一对我有用的解决方案。虽然已经为我的 arm64 目标安装了所有东西,但如果您在 m1 上,您也不必每次都指定 arch -arm64follow this 为 m1 安装 brew
A
Arno

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

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

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


M
Muhammad Dyas Yaskur

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


W
Weston Reed

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

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

这是唯一对我有用的解决方案,有助于遵循通过 github 生成 GPG 密钥的正确方法
就我而言,问题是我在特定的仓库中使用了公司电子邮件,而我没有为此生成 PGP 密钥。
h
haridsv

这对我来说突然在 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 终止代理(它会在下次重新启动)。


x
x squared

除了没有使用 git 正确设置 gpg 密钥外,另一个可能的问题是:尝试从 ssh 会话内部使用 X 转发进行提交。在这种情况下,它可能会尝试调用一个 GUI,如果未设置 env var DISPLAY,该 GUI 将失败。

您可以通过编辑 ~/.gnupg/gpg-agent.conf 来强制 gpg-agent 使用 tty-only 工具:

pinentry-program /usr/bin/pinentry-tty

然后重新加载conf:

gpg-connect-agent reloadagent /bye

(当然要先安装 pinentry-tty)


gpg-connect-agent reloadagent /bye 对我来说是关键。谢谢!
M
Muhammad Dyas Yaskur

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


J
JavaRocky

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

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

$ gpg --edit-key

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


d
devil in the detail

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

要更新正确的密钥,请执行以下操作:检查密钥使用: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


j
jww

我对最新的 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


S
Skylar Brown

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


a
asus

上面的答案很好,但它们对我不起作用。解决我的问题的是导出公钥和私钥。

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

$ 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/

附言。我的密钥最初是在 bootcamp windows 7 上制作的,然后我将它们导出到我的 mac air 上(同一台物理机,实际上不同)


J
John

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


A
Aashutosh Rathi

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

git config --global gpg.program gpg

和tada,它就像魅力一样。

https://i.stack.imgur.com/fUTps.png

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