尝试在WSL上使用gpg签署git提交,但无法正常工作。

21

我最近尝试使用Windows子系统来运行Linux,当我试图用最近生成的GPG密钥签署git提交时,它显示如下:

verticalfile30@DESKTOP-U284V9I:~/cpo/wsltest$ git commit -S -m "gpg signing"
error: gpg failed to sign the data
fatal: failed to write commit object

我使用git已经有一段时间了,知道必须在git上设置本地或全局变量才能使用我的GPG密钥。
第一次出错后,我尝试生成另一个密钥,但是也没有成功,包括子密钥。
我的GPG加密采用RSA和RSA(默认)。
我尝试使用help.github.com上的文章,但没有成功。
(以下是一些具体来源。) https://help.github.com/en/articles/telling-git-about-your-signing-key

https://help.github.com/en/articles/signing-commits

以下是终端日志的大部分内容

verticalfile30@DESKTOP-U284V9I:~/cpo/wsltest$ git config --global commit.gpgsign true
verticalfile30@DESKTOP-U284V9I:~/cpo/wsltest$ gpg2 --list-secret-keys --keyid-format LONG
gpg: checking the trustdb
gpg: marginals needed: 3  completes needed: 1  trust model: pgp
gpg: depth: 0  valid:   2  signed:   0  trust: 0-, 0q, 0n, 0m, 0f, 2u
gpg: next trustdb check due at 2021-08-22
/home/verticalfile30/.gnupg/pubring.kbx
---------------------------------------
sec   rsa4096/498F47808959B459 2019-08-23 [SC] [expires: 2021-08-22]
      A533C851D2905FC63C161831498F47808959B459
uid                 [ultimate] Vert Simon (Key#3) <stopmotion45c@gmail.com>
ssb   rsa4096/E4E65BE559FFBE2C 2019-08-23 [E] [expires: 2021-08-22]

sec   rsa4096/B3C88EE54DC15CC9 2019-08-23 [SC]
      87F5399E6BFEF88C1C64794CB3C88EE54DC15CC9
uid                 [ultimate] Vert S (Sop) <stopmotion45c@gmail.com>
ssb   rsa4096/E868623210106F9D 2019-08-23 [E]

verticalfile30@DESKTOP-U284V9I:~/cpo/wsltest$ git config --global user.signingkey E868623210106F9D
verticalfile30@DESKTOP-U284V9I:~/cpo/wsltest$ git commit -S -m "gpg signing"
error: gpg failed to sign the data
fatal: failed to write commit object
verticalfile30@DESKTOP-U284V9I:~/cpo/wsltest$ git config --global user.signingkey B3C88EE54DC15CC9
verticalfile30@DESKTOP-U284V9I:~/cpo/wsltest$ git commit -S -m "gpg signing"
error: gpg failed to sign the data
fatal: failed to write commit object

许多在线资源以及Stack Overflow上的其他问题最终都会说同样的话,即设置全局变量。我是否忘记了什么或者出了什么问题?谢谢。

3个回答

35

随后是microsoft/WSL问题4029

但在那种情况下,是这样的:

我的密钥有一个密码短语,但没有提示输入密码。

但是我读到了这个

第3步是export GPG_TTY=$(tty),它将提示发送到tty。
输入我的密码短语后,一切正常运行。

例如:danhorst/dotfiles提交805a779,其后跟gpg无法签署数据致命错误:无法写入提交对象[Git 2.10.0]


您还可以参照如何在Windows 10和WSL2上使用Visual Studio Code为GitHub签署提交来自Christopher Hamilton的指南。

2
可以确认这个解决方案在 Windows 11 上有效。 - Abir Taheer
@AbirTaheer Windows 11?!现在我得检查一下我能否运行它:https://github.com/rcmaehl/WhyNotWin11 - VonC
可以确认,在搜索了几个小时的互联网并确保变量设置正确后,此方法适用于Windows 10和WSL。提示是...如果您已经完成了所有其他步骤但未被提示输入GPG密码,那么这可能是您要找的答案。 - BillieM
@BillieM 自从我上次评论以来,我已经在Windows 11上进行了测试,我不再拥有Windows 10的访问权限。 - VonC

13
如果您在Windows上使用Kleopatra来管理GPG密钥,则可以将以下内容添加到WSL环境中的~/.gitconfig中(请根据需要更新您的路径):
[gpg]
    program = /mnt/c/Program Files (x86)/GnuPG/bin/gpg.exe

添加完这行代码后,我的GPG密钥提示输入密码的框正常弹出。
背景:使用挂载卷时,我在使用Docker时遇到了极慢的情况。因此,我决定在Ubuntu WSL环境目录中部署存储库(即~/projects/my_project),并使用Docker WSL2支持从那里启动容器。我使用Visual Studio Code,因此可以直接将编辑器打开到WSL环境中并从那里工作。但是,我失去了签署提交的能力。因此,上述解决方案使我能够保留现有的工作流程。

我一直在努力让它运行。我在Kleopatra中生成了我的密钥,并尝试在WSL2中签署提交。它使用的是Linux GPG可执行文件,但并未起作用。这使我能够在WSL2命令行上进行提交!谢谢! - Steve Storck
解决方案对我很有效,也是最简单的,谢谢。 - mcmikecreations
对于那些从工作中的Win11环境切换到WSL2的人来说,这是一笔金矿。谢谢。 - f-re
对于那些从工作中的Win11环境切换到WSL2的人来说,这是一笔金矿。谢谢。 - undefined

9
请按照以下链接设置签名提交:https://help.github.com/en/articles/telling-git-about-your-signing-key 如果出现“gpg failed to sign the data fatal: failed to write commit object”的错误提示,这不是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签名。

输出:

-----BEGIN PGP SIGNED MESSAGE-----
Hash: SHA512

test
-----BEGIN PGP SIGNATURE-----

iLMEAQEKAB0WIQS2V0SFHi18psvDbo7uFF+LP7qc1gUCYLjB2QAKCRDuFF+LP7qc
1r5LBACB1m3Lpl21379qAvVamWcn9isdgdg34t34t43t34t34t434yGQHqikxWL7A5
Ls7giKZYscb30o0rkY6I1W9MjBBW96R2pnaYsioFpsf434dfg54rfdgfdgdfgdfpaIoU3k
JKrYxR7yMjqUv0a2jE+97kh+bSuzqwIkMHyikbABI90lY+4OLw==
=UHKx
-----END PGP SIGNATURE-----

输出结果: 列出所有 Git 配置中包含 "gpg" 的配置项。 命令为:git config -l | grep gpg
commit.gpgsign=true
gpg.program=gpg
tag.gpgsign=true
  1. 执行 git commit -S -m "initial commit"
  2. 或者 git config --global commit.gpgsign true

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


虽然这解决了问题,但当我关闭终端并重新打开时,这个问题又出现了。 - Shadab Faiz
在第二步之后,我遇到了错误“gpg: can't connect to the agent: IPC connect call failed” - 这意味着WSL没有运行“gpg-agent”,这个答案对我很有帮助 - Andrew

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接