VS2019 gpg签名问题导致无法commit及其解决办法
问题描述
近期重做了系统,安装VS2019和git之后,在VS中发现在commit的时候会提示因为gpg问题导致commit失败, 但是使用git命令行却能正常签名并提交,感觉有点匪夷所思,一顿虎狼操作,终于发现了问题。
谨以此片段记录一下,希望对遇到同样问题的筒子们有所帮助。
系统环境
- Window 10 (21H1)
- Visutal Studio 2019 (16.11.1)
- git for window (2.32.0.2)
错误重现和分析
在git下或者全局git(以下示例是全局的)设置要求gpg签名
git config --global commit.gpgsign true
然后转到Visual Studio中的git changes窗口提交代码会出现如下错误
错误全文如下(你可能看到的是中文的,我这里仅仅安装了英文,提示是全英文的):
Your git-hook, ‘gpg’, is not supported, likely because the first line is not "#!/bin/sh".\r\nSee your administrator for additional assistance.
大概意思是,gpg没有成功执行,可能原因是第一行不是 #!/bin/sh
(shell脚本预定义行),
但是这个提示非常具有误导性,它成功的让我去检查gpg的执行程序,然而,在命令行下一切正常。
就在准备修复IDE的时候,突然想起windows下如果文件不存在,在批处理中调用时显示的消息就是类似的句子,
那么是不是因为找不到gpg而导致的挂掉呢?接下来我写了一个假的gpg
(名字叫:gpg.bat,内容只有一句:exit 9999
),并通过以下两种方法来验证:
- 把gpg.bat放到环境变量PATH自动识别的目录(例如
%SystemRoot%
) - 把gpg.bat放到VS的目录下(例如
C:\Program Files (x86)\Microsoft Visual Studio\2019\Enterprise\Common7\IDE
)
结果正如我们所预料的,在commit代码的时候看到提示应用程序错误,返回错误代码是 999 ,那么可以确定是路径问题了。
转述微软VS团队的对此问题的解释如下:
Visual Studio does not use the version of Git you’ve installed, it uses a Git package that comes with the IDE. It can, however, use binaries found on
%PATH%
to do things like GPG signing, etc. Since Git for Windows doesn’t add the$GIT_INSTALL_DIR/usr/bin
folder to%PATH%
Visual Studio cannot use the utilities that come with it.
翻译如下:
Visual Studio 不会使用您自己安装的 Git 版本,它使用 IDE 附带的 Git 包。但是,它需要使用在
%PATH%
上找到的二进制文件来执行 GPG 签名等操作。由于 Windows 版 Git 没有将$GIT_INSTALL_DIR/usr/bin
文件夹添加到%PATH%
,因此 Visual Studio 不能使用它附带的实用程序。
解决方案
- (推荐) 在当前PATH环境变量添加一行(需要重启VS IDE):
C:\Program Files\Git\usr\bin
- 在git配置中指定gpg绝对路径:
git config --global gpg.program "C:\Program Files\Git\usr\bin\gpg.exe"