我已经遇到这个问题很久了,终于找到了解决方法!
注意,我的电脑是Windows 10。
有很多可能导致这个问题。其中一些在其他答案中都有提到过。
此外,随着时间的推移和各种不同版本的VSCode(或VS或GitHub Desktop或其他使用git的程序),情况也会不同。有一次自动更新OpenSSL也是罪魁祸首。
简而言之,弄清楚发生了什么事情是一团糟。
我还有两点要补充,可以用来调试并找出问题所在:
- 与
PATH
相关
- 与
SSH_AUTH_SOCK
相关
PATH
我们需要验证的是IDE使用的git.exe
是否与终端上的相同。
每当你在Git Bash for Windows(从现在开始称为“Bash”)中时,PATH
与全局的PATH
不同,因为Bash插入了一些路径,在我这里是:
/mingw64/bin
/usr/bin
$HOME/bin
(请注意,以/
开头的路径会自动添加git安装文件夹,该文件夹默认为C:\Program Files\Git
)。
这可能会导致Bash和IDE解析不同的git.exe
,因为PATH
用于此(以及ssh.exe
和ssh-add.exe
)。
当我启动我的IDE时,例如vscode,它使用Windows的PATH来解析git.exe
,并且在我的设置中找到了C:\Program Files\Git\cmd\git.exe
。 这真的很不幸,因为在Bash终端中它发现了/mingw64/bin/git.exe
。
您可以在“输出”面板中的Git日志的第一行中找到VSCode的git版本。通过运行which git
或where git
(后者会显示所有在PATH
上都有的git),可以找到bash的git版本。
我标准化使用mingw64
中的git,并相应地调整了PATH
。
现在,如果您已经启用ssh-agent
,则在终端中输入密钥短语,你可能期望从那时起你的IDE也能够解析密钥短语,因为它们使用相同的git.exe
,从而使用相同的ssh.exe
和ssh-add.exe
。
SSH_AUTH_SOCK
任何终端或IDE与
ssh-agent
通信所需的唯一要素是它知道它的存在。这完全通过环境变量
SSH_AUTH_SOCK
来实现(参见
源代码)。
如果您的IDE或终端不知道此环境变量,则无法在
ssh-agent
中找到密码短语。
重要的是要意识到如何在各种程序之间传递此环境变量。这就是为什么许多SO上的答案会将其写入文件
~/.ssh/agent.env
并在每个bash终端上读取该文件。但这对于IDE来说不是一个好的解决方案。如果你将其与Powershell结合起来,这也不是一个好的解决方案:
- Powershell也不会写入
.env
文件,因此bash不会知道有关ssh-agent的信息。这就是为什么
-StartupType Automatic
在终端中没有影响的原因。如果你看到有多个ssh-agents被生成,那么这可能是原因之一。
- Powershell也不从
.env
文件中读取,因此它不知道bash实例化的
ssh-agent
。
您可以通过设置环境变量来启动IDE,例如通过对比以下内容来确认这是实际问题:
-
code ./your-project
(会导致权限被拒绝),与
-
export SSH_AUTH_SOCK=/tmp/ssh-...your/agent...; code ./your-project
(假设
ssh-client
已经启动并且填充了,即在其他地方已调用了
ssh-add
)。
您可以通过运行
ssh-agent
来查找代理的套接字,它将打印出来(否则您尚未启动它或添加过您的密码短语)。
现在的问题是如何让VSCode知道
SSH_AUTH_SOCK
。上面列出了一些方法(例如
这里),这些方法有时对我有效,但并不总是/当前。我也不知道那会怎么工作。如果您知道,请告诉我。
如果您从终端启动vscode并导出
SSH_AUTH_SOCK
,那么它将可以访问
ssh-agent
,但是如果您从开始菜单或其他快捷方式启动vscode,则不会具有该环境变量。您无法在系统启动时将其设置为全局环境变量,因为该值在运行ssh-agent时才被分配,太晚了。
所以目前我就这么做了。我通过vscode终端重新启动vscode。这并不是很令人满意。我正在考虑更改快捷方式。我最后一个问题是:任何到达这里的人都知道IDE如何了解
SSH_AUTH_SOCK
环境变量吗?我没有看到它。对于启动项,VSCode似乎不运行
〜/ .bashrc
,仅针对终端。也许这是在不同VSCode版本中变化的行为?
杂项
最后一件事情:确保您的环境变量
GIT_SSH
和
GIT_SSH_COMMAND
为空(即您没有修改过它们并且忘记了)。git配置
sshCommand
也是如此。(我的指向
C:/Program\\ Files/Git/usr/bin/ssh.exe
)。
Set-Service -StartupType Automatic
代替。 - priyabagusgit config --global core.sshCommand /usr/bin/ssh
?我尝试了一下,但似乎并没有解决 Ubuntu 20.04 上 VS Code 的问题。 - zoltankundi