gpg失败的数据签名致命:失败的写入提交对象[Git 2.10.0]

我在Git 2.10发布说明上参考了几篇关于漂亮的属性的文章。通过将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-bit RSA key, ID AAAAAAAA, created 2016-07-01

error: GPG failed to sign the data fatal:写提交失败 对象< / p >

< em >注意< / em > -我仍然可以使用git commit -a -m "message"提交更改

有没有办法克服同样的问题?或者需要在gpg配置中进行任何更改以配合git的升级?< / em >


< em >更新1 < / em >

也寻求进一步的有用性,跟随有没有办法“自动签名”?在Git中使用GPG密钥提交?。我已经配置了密钥使用

git config --global user.signingkey ED5CDE14(with my key)
git config --global commit.gpgsign true

很明显得到了相同的错误。

395198 次浏览

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

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

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


最初的回答:

阅读“7.4 Git工具-签名你的工作”,我假设您已经设置了“user.signingkey”配置。

最后一次围绕gpg的大重构(在Git 2.10之前)是在提交2 f47eae2a,在这里错误消息被移到了gpg-interface.c

该文件的日志显示了提交af2b21e (Git 2.10)中最近的更改

Gpg2默认已经使用长格式,但大多数发行版似乎仍然让“gpg”是旧的1。X版本由于兼容性原因。旧版本的gpg只显示32位的短ID,这是相当不安全的。

这实际上对验证本身并不重要:如果
.验证通过,表示PGP签名正常 但如果你不 实际上已经有了密钥,想要获取它,或者想要检查 到底哪个密钥被用于验证,我们想检查它

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

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

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

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

让我们转换为使用tempfile对象,它处理 对于我们来说,困难的情况,并添加缺少的清理调用

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

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

如果您正在使用自制程序,并且像我一样升级了软件包,那么您可能只需要运行brew switch gnupg 1.4.20来恢复。

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

最初的回答:

这似乎是一个gpg更新(brew)改变了位置gpggpg1,你可以改变二进制代码,git在哪里查找gpg:

git config --global gpg.program gpg1

如果你没有gpg1: brew install gpg1

答:更新

它看起来gpg1被弃用了/“被轻轻推出使用范围”;,所以你可能应该更新到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,后一部分安装一个黑客需要使用它。关于故障排除,请参阅这个答案(虽然这是关于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二进制文件(/usr/local/bin/gpg -> /usr/local/MacGPG2/bin/gpg2)是作为GPG套件的一部分安装的,而不是通过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

我验证了我已经正确地改变了gpg在我的$PATH指向新的可执行文件从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套件。我当时运行的是2016.7版本,我发现更新到2016.10解决了这个问题。

我打开GPG Keychain.app,点击“Check for updates…”在新版本中:签名提交再次正常工作。

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

export GPG_TTY=$(tty)

看到# EYZ0。

确保你的邮箱设置正确。

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

我在构建最新的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失败,请遵循不能更新或使用包管理器——gpg错误的说明:

在终端:

ls /usr/local/lib

there ' s a bunch of readline libs in there (libreadline.so.BLAH-BLAH) 所以我:< / p >

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

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

可能有助于杀死进程gpg-agent可能卡住旧数据。因此,新gpg-agent启动会要求输入密码。

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

您可以通过以下方式添加另一个UID:

$ GPG—编辑键

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

我有完成它通过这个容易食谱:

自动签名提交macOS(全局和不同的ide):

把你的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

# EYZ0:

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

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

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

如果一切都失败了,使用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

现在手动运行失败命令:

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

事实证明,我的钥匙过期了,git不能怪我。

上面的答案很好,但对我来说并不管用。解决我的问题是同时导出公共秘密键。

列出要导出的机器上的键

$ 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

宾果邦戈,你完蛋了!

参考:# EYZ0

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

简单地通过:

brew uninstall gpg


brew install gpg2

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

git config -l | grep gpg

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

git config --global --unset commit.gpgsign

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

在我的例子中,其他答案中提到的解决方案都不起作用。我发现这个问题特定于一个存储库。删除和克隆回购再次解决了这个问题。

我的观点是:

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

当您使用任何其他与gpg接口的程序时,gpg的提示符向您输入您的密码是否出现(基本上是gpg-agent时daemonized不可能显示您在stdin中的输入对话框)。

其中一个解决方案是gpg --sign a_file.txt,然后输入您在创建密钥时输入的密码短语,然后一切都应该正常(gpg-agent应该自动签名)

请参阅这个答案,了解如何为密码短语设置更长的超时,以便您不必一直这样做。

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

编辑:做一个man gpg-agent阅读一些关于如何自动发生上述情况和添加线条的东西:

GPG_TTY=$(tty)
export GPG_TTY

在你的。bashrc上如果你正在使用bash(这是正确的答案,但我也保持我的思路),然后来源你的.bashrc文件或重新登录。

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

git的痕迹非常暴露了我的情况……

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

然后就成功了。

我一定是不小心更新了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为我解决了这个问题。

可能是一个挂着的gpg-agent。

试试gpgconf --kill gpg-agent 如本文所述

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

  1. # EYZ0
  2. # EYZ0
  3. brew install pinentry-mac(如果需要)
  4. 使用算法创建密钥。
  5. 通过执行:gpg --list-keys获取生成的密钥
  6. 在这里设置键git config --global user.signingkey <Key from your list>
  7. # EYZ0
  8. # EYZ0
  9. 如果你想导出你的密钥到GitHub,然后:gpg --armor --export <key> 并将该键添加到GitHub的GPG键:https://github.com/settings/keys(包括START和END行)

如果问题仍然存在:

# EYZ0

# EYZ0

如果问题仍然存在:

安装https://gpgtools.org并通过从菜单栏中按标志来签署您使用的密钥:关键-> sign

如果问题仍然存在:

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

[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

按照下面的url设置签名提交 # EYZ0 < / p >

如果仍然得到 GPG签署数据失败致命: Failed to write commit object

.日志含义

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

  1. # EYZ0
  2. # EYZ0

如果显示:

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

  3. < p > # EYZ0

gpg.program=gpg
commit.gpgsign=true
  1. 应用# EYZ0
我在Ubuntu 18.04上得到了同样的错误,也担心了几个星期。 最后意识到gpg2没有指向任何东西。 所以只需运行

git config --global gpg.program gpg

然后,它就像魅力一样。

Signed commit

您的提交现在将带有验证标记。

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

我在Ubuntu 18.04上得到了这个错误,原来我的密钥过期

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

gpg --list-keys

为了纠正这个错误,我运行(使用之前命令中显示的ID):

gpg --edit-key <ID>

从那里,我延长了key 0key 1的到期时间,然后是这些指令,最后是输入key 0,然后是expire,并按照提示进行操作。然后重复key 1

之后,为了测试这一点,我运行:

echo test | gpg --clearsign

在修复之前,它失败了,错误如下:

gpg: no default secret key: no secret key
gpg: [stdin]: clear-sign failed: No secret key

但是在修复之后,相同的命令成功地对消息进行了签名,所以我知道事情又开始工作了!

我也见过类似的答案,但没有一个完全适合我。在Linux上,我必须杀死并重新启动我的gpg-agent:

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

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

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

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

如果您使用GUI代理或不使用ncurses的东西,这一点将不适用。

我在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杀死代理(它会在下次重新启动)。

在OS X上,通过brew使用gnupg2,我只需要杀死GPG特工,有时会发生:

pkill -9 gpg-agent

如果需要,设置env变量:

export GPG_TTY=$(tty)

参见常见的GPG问题这也是答案。

对我来说,brew已经更新了gnupggpg,所以我所要做的就是解决这个问题。

brew link --overwrite gnupg

这将gpg链接到正确的位置,因为我可以通过which gpg确认,之后一切都正常工作。

prezto另一个zsh变体中遇到了这种情况。有问题是我的git回购是新的,没有node_modules添加到.gitignore。当我将node_modules添加到.gitignore时,问题就没有了。所以我的假设是git-info需要时间,因为这些大的node_modules

如果你不想用brew来安装gpg,这似乎会时不时地遇到问题,你可以从GPG工具下载gpg工具。

在执行向导时,单击customize install并取消选择邮件插件(除非您想使用它)。这些工具似乎没有遇到任何问题,而且它会在你第一次签署提交后记住你的密码。不需要额外的配置,除了告诉Git关于哪个键使用。

至少这是我的经验。

在我的情况下,没有一个解决方案是有效的,因为我没有手动进入我的~/.gitconfig并删除以下内容,因为我创建了一个新密钥,不再是我的旧X.509密钥,所以我删除了以下内容,然后我的新密钥开始工作。

[gpg]
program = gpg
format = x509
[gpg "x509"]
program = smimesign

以上都不适合我,我通常使用我的IDE终端。

我时不时地得到这个错误,在大多数情况下,它工作得很好。 我在运行

后发现了这个问题
 echo "test" | gpg --clearsign


gpg: signing failed: Screen or window too small
gpg: [stdin]: clear-sign failed: Screen or window too small

解决方案:增加终端窗口大小。

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

Andy Hayden的更新答案需要修改如下:

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

如果你像我一样和IDE一起使用WSL,你可能会遇到这个问题,因为密码“窗口”在使用IDE的提交接口提交时从未显示(WSL还不支持GUI应用程序)

修复方法是简单地使用命令行git,因为它有自己的cli窗口供您输入密码。你还需要确保终端的“大”足以弹出(令人惊讶的是我知道)

signing commits using WSL

我得到这个错误,每次登出,然后再次登录我的macOS。解决方案只是一个简单的命令:

killall gpg-agent

我认为这只是gpg代理的一个错误,杀死它,然后重新工作。

如果你的问题是Visual Studio代码不允许提交,但你已经设置了你的GPG签名,那么bash的一行答案是:

git config --global gpg.program `which gpg2`

如果你在PATH中有gpg,而不是gpg2,那么就用它来代替。

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

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

pinentry-program /usr/bin/pinentry-tty

然后重新加载conf:

gpg-connect-agent reloadagent /bye

(当然先安装pinentry-tty)

在我的例子中,问题在于gpg~/.gitconfig中的相对名称。我把它改成这样,问题就消失了(蒙特雷,Macbook M1):

[gpg]
program = /opt/homebrew/bin/gpg

解释很简单:当git试图运行gpg时,它在一个新的shell中运行,而不运行~/.profile,其中我为自制程序配置了PATH。所以,它根本找不到gpg

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

我正在使用M1 Mac,在那里我已经尝试了上面最常见的解决方案,但没有工作,我的问题是GPG二进制缺失在这里=># EYZ0

最初,我通过brew安装了GPG,我试着重新安装它,但找不到它存储的二进制文件,后来我从这里安装了GPG Suite GUI =>GPG套件工具,它成功了。

最后,我可以在Github上登录提交并获得验证徽章。

这几个命令似乎对我有用,因为我个人在升级到Mac OS 12.4后也有同样的问题

brew upgrade gnupg
brew install pinentry-mac
echo "pinentry-program /usr/local/bin/pinentry-mac" >> ~/.gnupg/gpg-agent.conf
killall gpg-agent && gpg-agent --daemon
git config --global gpg.program gpg
git config --global commit.gpgsign true

使用OSX终端代替集成的VS Code终端对我来说很有效。VS Code集成终端已经允许我签署这个相同的回购直到今天。以前当我有这个错误时,我通过更新VS Code来修复它,但这次更新不起作用。

我有同样的错误,在VSCode更新后。虽然我的安全提交工作正常,更新VSCode后,我得到了这个错误:

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

唯一恢复功能的是这个命令:

echo "test" | gpg --clearsign

命令返回错误如下:

gpg: signing failed: Screen or window too small
gpg: [stdin]: clear-sign failed: Screen or window too small

增加终端后,我能够键入我的通行证短语。非常奇怪的情况。

我发现检查git commit在引擎盖下做了什么非常有用。使用GIT_TRACE=1执行以下提交:

GIT_TRACE=1 git commit -S -m "MESSAGE"

这将显示git在提交时使用的用户名、电子邮件和签名密钥。

在我的例子中,我发现git为签名提交选择了错误的用户和关键细节。我主要打算使用repo的本地配置,而不是全局配置,并在本地git配置中添加以下内容(位于"REPO_PATH/.git/config"),让提交在终端和VSCode中都可以工作

[user]
name = USER NAME
email = USER EMAIL
signingKey = SIGNING KEY

也可以设置如下:

git config --local user.name "USER NAME"
git config --local user.email "USER EMAIL"
git config --local user.signingkey "USIGNING KEY"

我的解决方案是:

  • 首先,我试图了解为什么这是行不通的细节。在终端上按cmd命令尝试
   $ echo "Hello" > test.txt
$ gpg --sign --default-key <your-email-id> test.txt
  • 观察到详细信息的错误:gpg: signing failed: No pinentry
gpg-agent[59045]: can't connect to the PIN entry module '/usr/local/bin/pinentry': IPC connect call failed
gpg-agent[59045]: failed to unprotect the secret key: No pinentry
  • 从终端我点击下面的cmd:
    cat ~/.gnupg/gpg-agent.conf
  • 检查以下陈述是否存在。# EYZ0
< p > pinentry-program /usr/local/MacGPG2/libexec/pinentry-mac.app /内容/ MacOS / pinentry-mac < / p >
  • 添加pinentry路径后,运行
    $ gpgconf --kill gpg-agent
$ gpg --sign --default-key <your-email-id> test.txt


  • 查看输出:
 gpg: using <your-email-id> as default secret key for signing