VSCode + WSL Remote + Git:同步更改需要很长时间

Posted

技术标签:

【中文标题】VSCode + WSL Remote + Git:同步更改需要很长时间【英文标题】:VSCode + WSL Remote + Git : Synchronizing changes take forever 【发布时间】:2020-01-20 20:56:05 【问题描述】:

我将 VSCode 远程使用到位于(符号链接)到 WSL 2 VM 的项目文件夹中。我使用 SSH 和终端从 Bitbucket 克隆了我的 repo。

在左下角,它表示WSL: Ubuntu,所以我目前正在远程使用它。一切都好 如果我单击 Git 分支指示器,我可以看到本地分支和远程分支。一切都好

问题是,当我在本地提交后单击以同步所有内容时,它会永远旋转。好吧,不是真的,我会在永远发生之前失去耐心......目前在当前测试中大约需要 30 分钟。

如果我在终端输入git push,一切都会按预期进行。

有人知道为什么要这样做吗?我该如何解决这个问题?

我的 Git 输出到 VSCode 中不断返回这个 git rev-parse --show-toplevel? 我为 user.name 和 user.email 都做了git config SSH 密钥在 Bitbucket 上设置。 Windows 和 WSL 2 使用相同的公钥/私钥。

谢谢

【问题讨论】:

【参考方案1】:

2021-02-05 更新

这个问题最近得到了很多人的关注,我觉得我需要做一个更彻底的解释。最初的答案是在 WSL 2 仍处于测试阶段以进行测试时编写的。现在一切都在发展,从 SSH 密钥中删除密码可能会导致一些漏洞。所以,在进一步讨论之前,先看看这篇帖子Is it okay to use a SSH key with an empty passphrase?

问问自己删除它是否安全。

我不知道原始问题是否还有问题。写完问题后不久,我就放弃了 Web 开发的 WSL。

原始答案

我解决了我的问题。因此,对于那些想要尝试 WSL 2 并遇到此问题的人来说,问题在于 SSH 密钥的密码。

https://code.visualstudio.com/docs/remote/troubleshooting#_resolving-hangs-when-doing-a-git-push-or-sync-on-an-ssh-host

解决在 SSH 主机上执行 Git 推送或同步时的挂起问题 如果您使用 SSH 克隆 Git 存储库并且您的 SSH 密钥具有密码,则远程运行时 VS Code 的拉取和同步功能可能会挂起。 要么使用不带密码的 SSH 密钥,要么使用 HTTPS 进行克隆,要么从命令行运行 git push 来解决此问题。

如果您想删除密码,请使用$ ssh-keygen -p,如本问题所述:https://***.com/a/112409/5543999

【讨论】:

使用 ssh-keygen -p 删除密码已为我修复【参考方案2】:

您也可以使用 ssh-agent 解决此问题。

将以下内容添加到您的 ~/.bashrc 中,当您打开终端时,系统会提示您解锁您的密钥(如果未解锁)。

env=~/.ssh/agent.env

agent_load_env ()  test -f "$env" && . "$env" >| /dev/null ; 

agent_start () 
    (umask 077; ssh-agent >| "$env")
    . "$env" >| /dev/null ; 

agent_load_env

# agent_run_state: 0=agent running w/ key; 1=agent w/o key; 2= agent not running
agent_run_state=$(ssh-add -l >| /dev/null 2>&1; echo $?)

if [ ! "$SSH_AUTH_SOCK" ] || [ $agent_run_state = 2 ]; then
    agent_start
    ssh-add
elif [ "$SSH_AUTH_SOCK" ] && [ $agent_run_state = 1 ]; then
    ssh-add
fi

unset env

来源:https://docs.github.com/en/github/authenticating-to-github/working-with-ssh-key-passphrases#auto-launching-ssh-agent-on-git-for-windows

此外,您可以按如下方式配置添加到 ssh-agent 的密钥的到期时间 - https://unix.stackexchange.com/questions/122511/configuring-the-default-timeout-for-the-ssh-agent

【讨论】:

【参考方案3】:

在这种情况下,删除密码是最简单的选择,但您也可以查看相关问题:microsoft/vscode-remote-release issue 2369

它包括由Elsie Hupp 找到的recent workaround(2021 年 2 月):

我想出了一个潜在的解决方法:SSH Agent Forwarding。

在您的 SSH 配置中,对于远程 VS Code 主机,添加以下内容:

    ForwardAgent yes

(缩进很重要。)

对我来说,使用 VS Code 设置为 SSH 的主机称为 alpha,因此文件的部分如下所示:

Host alpha
    ForwardAgent yes

如果您想对所有远程主机执行此操作,可以将其添加到 Host * 部分(尽管这显然是一个边际安全风险):

Host *
    ForwardAgent yes

它的作用是使用您用来连接远程主机的 SSH 代理,并为来自远程的任何 SSH 连接(例如连接到 Git)回收 SSH 密钥。 因为当您连接到 VS Code 远程时 VS Code 会很乐意提示您输入 SSH 密钥的密码,所以您可以在初次连接时输入密码,而无需在与 Git 交互时重新输入。

显然您可以在代理转发时使用多个本地 SSH 密钥,但我无法对此进行测试。总的来说,我还无法对此进行测试,但它似乎很有希望。

【讨论】:

【参考方案4】:

与其删除密码短语,不如直接从命令行推送和拉取!

【讨论】:

以上是关于VSCode + WSL Remote + Git:同步更改需要很长时间的主要内容,如果未能解决你的问题,请参考以下文章

在VsCode中使用remote-wsl.

一次不正经的Remote_WSL2体验

带有 VSCode + WSL2 + Docker 的 Windows 上的 Git + SSH 密钥问题

VSCode 作为 Windows Subsystem for linux (WSL) 上的 Git 编辑器

vscode+WSL+Debug+Cmake+OpenGL

vscode wsl php