2 分钟阅读

问题描述

近期重做了系统,安装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窗口提交代码会出现如下错误 VS2019 gpg error

错误全文如下(你可能看到的是中文的,我这里仅仅安装了英文,提示是全英文的):

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"

参考