Visual Studio 代码中没有 GPG 密码提示 Windows 10 使用 WSL2 签名的 git 提交
No GPG passphrase prompt in Visual Studio Code on Windows 10 for signed git commits using WSL2
当从 Windows 10.
在 WSL2 中提交代码时,我无法在 Visual Studio 代码中使用签名提交
问题
Windows10 内未显示密码提示,导致 git 失败 error: gpg failed to sign the data
设置
Windows 设置
带有 WSL2 和 Windows 终端的 Windows10 的最新版本。
Visual Studio 代码安装在 Windows 10 中,是最新版本 (1.48.0),包括最新的远程 WSL 扩展 (v0.44.4)。
我的代码在 WSL2 运行ning Ubuntu 20.04 中,所有包都已更新。
Visual Studio 使用 WSL2 中的 code .
命令通过命令行打开代码。
Git 设置
Git (2.25.1) 安装在 WSL2 中,具有以下全局配置:
[user]
name = My Name
email = my.email@example.com
signingkey = A1B2C3D4E5F67890
[commit]
gpgsign = true
git 存储库是使用 WSL2 中的命令行启动的。
GPG 设置
gnupg (2.2.19) 安装在 WSL2 中。
我有 ~/.gnupg/gpg.conf
个设置
use-agent
default-key A1B2C3D4E5F67890
和~/.gnupg/gpg-agent.conf
default-cache-ttl 34560000
max-cache-ttl 34560000
pinentry-program /usr/bin/pinentry-curses
还有我的~/.zprofile
export GPG_TTY=$(tty)
export GPG_AGENT_INFO=${HOME}/.gnupg/S.gpg-agent:0:1
什么有效
如果我在 Windows 终端中从 WSL2 中 运行 a git commit
,它会提示我输入密码。
┌────────────────────────────────────────────────────────────────┐
│ Please enter the passphrase to unlock the OpenPGP secret key: │
│ "My Name <my.email@example.com>" │
│ 4096-bit RSA key, ID A1B2C3D4E5F67890, │
│ created 2020-08-10. │
│ │
│ │
│ Passphrase: __________________________________________________ │
│ │
│ <OK> <Cancel> │
└────────────────────────────────────────────────────────────────┘
此密码短语将在我的 Windows 会话的其余部分缓存,直到我重新启动笔记本电脑。此后的任何提交都不再提示输入密码。
我现在可以使用 Visual Studio 代码 git UI 和 VSCode 的内置终端来提交更改。
问题
如果我重新启动我的笔记本电脑,然后从 Visual Studio 提交,代码将无法工作,直到我首先在 WSL2 中缓存 GPG 密码。
可能值得注意,但如果我没有缓存密码并在 Visual Studio 代码中打开代码并尝试从内置 VSCode 终端进行提交,它也会失败。仅当密码首先通过 Windows 终端在 WSL2 中输入时才有效。
我很欣赏 Windows 10 和 WSL2 实际上是两个不同的系统,但是有什么方法可以让 Windows 显示 git [=127 的 GPG 密码提示=]宁在WSL2?
或者我需要进行完全不同的设置吗?我已经使用 MacOS 进行开发很长时间了,所以不确定 Windows 10.
上的最佳路线是什么
编辑:2020-08-17
我找到 https://github.com/diablodale/pinentry-wsl-ps1 并使用脚本作为 pinentry。当未缓存密码时,这会起作用并在 Windows 10 中显示 GUI。但我想找到一个不依赖于可能停止运行的脚本的解决方案。
您已指定 pinentry-curses
程序,这意味着当您希望系统提示您输入密码时,您需要有适当的 TTY 来提示您。
如果您不希望出现这种情况,可以使用其他输入法程序;例如,Debian 提供了 pinentry-gtk3
软件包,它可以提供图形提示。但是,这需要您的环境中有可用的功能 X11 服务器。这是必要的,因为 Linux 环境通常只支持通过 X11 的图形(或者可能是 Wayland,它在这里不太可能工作)。
还有像您提到的其他可能能够提供本机 Windows 提示的可能性,但所有这些都将依赖于额外的 add-on 软件,因为 Linux 发行版也没有 Windows 发布软件来提供此功能。 Linux 发行版通常不提供 Windows 图形界面的软件,因为它们不提供 Windows,所以他们的大多数用户将无法使用它。
微软计划在未来为 WSL 提供更好的图形支持,但目前还没有这样做。
我找到了解决方案...但在撰写本文时有一些注意事项。
由于 Visual Studio 代码在 Windows 10 中是 运行 并且 git & gpg 在 WSL2 中,我想尝试在 Windows 上进行视觉输入10面。
直到我订阅了 Windows Insider's track 并更新到最新的 Dev Build (2004 Build 20190.1000),这才起作用。
所需步骤:
加入 Windows Insider 计划并将 Windows 10 更新为 2004 Build 20190.1000(可能适用于早期版本,但这是我最先收到的版本)。这将为 WSL2 带来一些有趣的额外功能,提高互操作性 - 您现在还会注意到 Windows Explorer 中的 Linux 选项。
从 https://www.gpg4win.org 安装 GPG4Win。除了默认的 gnupg 之外,什么都不需要,但我也安装了 Kleopatra,以防它在其他地方派上用场。
编辑~/.gnupg/gpg-agent.conf
并更改pinentry
pinentry-program "/mnt/c/Program Files (x86)/GnuPG/bin/pinentry-basic.exe"
现在,当系统要求您输入密码时,会出现 GPG GUI。
我已经测试了这个重启机器以确保密码不被缓存并且它适用于:
- 从 WSL2 提交 command-line
- 使用 Visual Studio 代码 git UI
提交
- 使用 Visual Studio 代码 built-in 终端
提交
这符合我的要求,但很高兴听到是否有任何我可能没有考虑到的地方。
就我而言:
- 我使用 wsl2 (
ubuntu20.04 LTS
) 配置了 X server (X410
),并通过安装 pinentry-gtk2 找到解决方案。
- 然后将
pinentry-program
配置为/usr/bin/pinentry-gtk-2
,一切正常。
步骤:
- 配置您的 X 服务器。
- 安装 pinentry-gtk2。
sudo apt install pinentry-gtk-2
- 配置 gpg 代理。将
pinentry-program /usr/bin/pinentry-gtk-2
添加到 ~/.gnupg/gpg-agent.conf
- 重新加载 gpg-agent。执行命令
gpg-connect-agent reloadagent /bye
效果:
非常感谢@39digits 的有用回答!
截至 2021 年 8 月的一些更新:
使用最新版本的 gpg4win,您需要在 WSL2 的 ~/.gnupg/gpg-agent.conf
文件中设置以下配置 ubuntu:
pinentry-program "/mnt/c/Program Files (x86)/Gpg4win/bin/pinentry.exe"
之后,您可能需要通过运行重启GPG代理:
gpg-connect-agent reloadagent /bye
此外,您不再需要订阅 windows 内幕消息。
只是补充一点,现在看起来很简单
git config --local gpg.program /usr/bin/gpg
足以(在您的 git 存储库中)让 VS Code 能够正确地使用本地 gpg 安装签署提交
当从 Windows 10.
在 WSL2 中提交代码时,我无法在 Visual Studio 代码中使用签名提交问题
Windows10 内未显示密码提示,导致 git 失败 error: gpg failed to sign the data
设置
Windows 设置
带有 WSL2 和 Windows 终端的 Windows10 的最新版本。
Visual Studio 代码安装在 Windows 10 中,是最新版本 (1.48.0),包括最新的远程 WSL 扩展 (v0.44.4)。
我的代码在 WSL2 运行ning Ubuntu 20.04 中,所有包都已更新。
Visual Studio 使用 WSL2 中的 code .
命令通过命令行打开代码。
Git 设置
Git (2.25.1) 安装在 WSL2 中,具有以下全局配置:
[user]
name = My Name
email = my.email@example.com
signingkey = A1B2C3D4E5F67890
[commit]
gpgsign = true
git 存储库是使用 WSL2 中的命令行启动的。
GPG 设置
gnupg (2.2.19) 安装在 WSL2 中。
我有 ~/.gnupg/gpg.conf
个设置
use-agent
default-key A1B2C3D4E5F67890
和~/.gnupg/gpg-agent.conf
default-cache-ttl 34560000
max-cache-ttl 34560000
pinentry-program /usr/bin/pinentry-curses
还有我的~/.zprofile
export GPG_TTY=$(tty)
export GPG_AGENT_INFO=${HOME}/.gnupg/S.gpg-agent:0:1
什么有效
如果我在 Windows 终端中从 WSL2 中 运行 a git commit
,它会提示我输入密码。
┌────────────────────────────────────────────────────────────────┐
│ Please enter the passphrase to unlock the OpenPGP secret key: │
│ "My Name <my.email@example.com>" │
│ 4096-bit RSA key, ID A1B2C3D4E5F67890, │
│ created 2020-08-10. │
│ │
│ │
│ Passphrase: __________________________________________________ │
│ │
│ <OK> <Cancel> │
└────────────────────────────────────────────────────────────────┘
此密码短语将在我的 Windows 会话的其余部分缓存,直到我重新启动笔记本电脑。此后的任何提交都不再提示输入密码。
我现在可以使用 Visual Studio 代码 git UI 和 VSCode 的内置终端来提交更改。
问题
如果我重新启动我的笔记本电脑,然后从 Visual Studio 提交,代码将无法工作,直到我首先在 WSL2 中缓存 GPG 密码。
可能值得注意,但如果我没有缓存密码并在 Visual Studio 代码中打开代码并尝试从内置 VSCode 终端进行提交,它也会失败。仅当密码首先通过 Windows 终端在 WSL2 中输入时才有效。
我很欣赏 Windows 10 和 WSL2 实际上是两个不同的系统,但是有什么方法可以让 Windows 显示 git [=127 的 GPG 密码提示=]宁在WSL2?
或者我需要进行完全不同的设置吗?我已经使用 MacOS 进行开发很长时间了,所以不确定 Windows 10.
上的最佳路线是什么编辑:2020-08-17 我找到 https://github.com/diablodale/pinentry-wsl-ps1 并使用脚本作为 pinentry。当未缓存密码时,这会起作用并在 Windows 10 中显示 GUI。但我想找到一个不依赖于可能停止运行的脚本的解决方案。
您已指定 pinentry-curses
程序,这意味着当您希望系统提示您输入密码时,您需要有适当的 TTY 来提示您。
如果您不希望出现这种情况,可以使用其他输入法程序;例如,Debian 提供了 pinentry-gtk3
软件包,它可以提供图形提示。但是,这需要您的环境中有可用的功能 X11 服务器。这是必要的,因为 Linux 环境通常只支持通过 X11 的图形(或者可能是 Wayland,它在这里不太可能工作)。
还有像您提到的其他可能能够提供本机 Windows 提示的可能性,但所有这些都将依赖于额外的 add-on 软件,因为 Linux 发行版也没有 Windows 发布软件来提供此功能。 Linux 发行版通常不提供 Windows 图形界面的软件,因为它们不提供 Windows,所以他们的大多数用户将无法使用它。
微软计划在未来为 WSL 提供更好的图形支持,但目前还没有这样做。
我找到了解决方案...但在撰写本文时有一些注意事项。
由于 Visual Studio 代码在 Windows 10 中是 运行 并且 git & gpg 在 WSL2 中,我想尝试在 Windows 上进行视觉输入10面。
直到我订阅了 Windows Insider's track 并更新到最新的 Dev Build (2004 Build 20190.1000),这才起作用。
所需步骤:
加入 Windows Insider 计划并将 Windows 10 更新为 2004 Build 20190.1000(可能适用于早期版本,但这是我最先收到的版本)。这将为 WSL2 带来一些有趣的额外功能,提高互操作性 - 您现在还会注意到 Windows Explorer 中的 Linux 选项。
从 https://www.gpg4win.org 安装 GPG4Win。除了默认的 gnupg 之外,什么都不需要,但我也安装了 Kleopatra,以防它在其他地方派上用场。
编辑~/.gnupg/gpg-agent.conf
并更改pinentry
pinentry-program "/mnt/c/Program Files (x86)/GnuPG/bin/pinentry-basic.exe"
现在,当系统要求您输入密码时,会出现 GPG GUI。
我已经测试了这个重启机器以确保密码不被缓存并且它适用于:
- 从 WSL2 提交 command-line
- 使用 Visual Studio 代码 git UI 提交
- 使用 Visual Studio 代码 built-in 终端 提交
这符合我的要求,但很高兴听到是否有任何我可能没有考虑到的地方。
就我而言:
- 我使用 wsl2 (
ubuntu20.04 LTS
) 配置了 X server (X410
),并通过安装 pinentry-gtk2 找到解决方案。 - 然后将
pinentry-program
配置为/usr/bin/pinentry-gtk-2
,一切正常。
步骤:
- 配置您的 X 服务器。
- 安装 pinentry-gtk2。
sudo apt install pinentry-gtk-2
- 配置 gpg 代理。将
pinentry-program /usr/bin/pinentry-gtk-2
添加到~/.gnupg/gpg-agent.conf
- 重新加载 gpg-agent。执行命令
gpg-connect-agent reloadagent /bye
效果:
非常感谢@39digits 的有用回答!
截至 2021 年 8 月的一些更新:
使用最新版本的 gpg4win,您需要在 WSL2 的 ~/.gnupg/gpg-agent.conf
文件中设置以下配置 ubuntu:
pinentry-program "/mnt/c/Program Files (x86)/Gpg4win/bin/pinentry.exe"
之后,您可能需要通过运行重启GPG代理:
gpg-connect-agent reloadagent /bye
此外,您不再需要订阅 windows 内幕消息。
只是补充一点,现在看起来很简单
git config --local gpg.program /usr/bin/gpg
足以(在您的 git 存储库中)让 VS Code 能够正确地使用本地 gpg 安装签署提交