【问题标题】:Connect to Git repository with SSH using Visual Studio 2017使用 Visual Studio 2017 通过 SSH 连接到 Git 存储库
【发布时间】:2017-08-04 01:25:51
【问题描述】:

我正在尝试使用 Visual Studio 2017 中的 SSH 连接到 Git 存储库(在 Bitbucket 上)(据我所知,它支持 Git 的 SSH)。我已经设置好所有东西,在我的计算机上克隆了存储库,我可以提交,但是如果我尝试执行诸如获取它之类的操作,则会失败并显示以下消息(来自 Visual Studio 的“输出”窗口):

Error encountered while fetching: Git failed with a fatal error.
fatal: Could not read from remote repository.

在命令提示符下尝试,我得到了这些信息略多的消息:

Permission denied (publickey).
fatal: Could not read from remote repository.

Please make sure you have the correct access rights
and the repository exists.

从 Git Bash 我尝试打开 SSH 代理,添加我的私钥并获取,它似乎可以工作(或者至少我没有收到任何消息,这与代理未启动或密钥未启动时不同添加):

eval `ssh-agent`
ssh-add ~/.ssh/xxxx
git fetch

但 Visual Studio 仍然无法连接。我也尝试在 Windows 命令提示符下做同样的事情:

ssh-agent
set SSH_AUTH_SOCK=/tmp/ssh-SIAryCa61iz9/agent.11128
set SSH_AGENT_PID=9804
ssh-add xxxx
git fetch

但我仍然遇到同样的错误。

我已经将公钥添加到 Bitbucket,ssh -T git@bitbucket.org 确实输出“以 xxxx 身份登录”。此外,我可以使用 SourceTree 正确连接并将私钥添加到 Pageant(我用于 ssh-add 的密钥具有所需的 OpenSSH 格式,我是从 .ppk 格式创建的)。

【问题讨论】:

  • 我正在使用 VS2017 Com。对于 Mac 并有同样的问题。尝试了以下的 Mac 版本,没有。
  • 总的来说,通过 SSH 连接到 Bitbucket 是个坏主意,因为没有直接的解决方案。更简单的方法是获取 Bitbucket 令牌,将其存储在 Windows 凭据管理器中,然后使用 HTTPS 链接访问您的存储库。如果您有兴趣,我可以写一个完整的答案...

标签: git ssh visual-studio-2017


【解决方案1】:

我终于设法使它工作,使用 PuTTY 的 Pageant 身份验证代理而不是 ssh-agent,并按照提到的步骤 here(它适用于 Visual Studio Code,但适用于 Visual Studio 2017,我想它应该适用于任何使用“官方”Git for Windows 的应用程序)。

由于我已经安装了 Pageant 并创建了 .ppk 私钥,我只需要让 Git 使用 Pageant,方法是创建 GIT_SSH Windows 环境变量并将其设置为“plink.exe”文件的路径(在 PuTTY 安装中,例如 C:\Program Files (x86)\PuTTY\plink.exe)。完成后,我只需要打开 Pageant 并添加私钥(并在使用存储库时将其保持打开状态),Visual Studio 就可以正常连接并发出命令。

【讨论】:

  • 要永久保存选美到键,不要忘记将您的 ppk 添加到快捷方式目标,例如:"C:\Program Files\PuTTY\pageant.exe" %userprofile%\.ssh\id_rsa.ppk
  • 也适用于C:\Program Files\TortoiseGit\bin\TortoiseGitPlink.exe
  • 在 VS2019 上的工作就像一个魅力......在我的情况下,我没有单独安装 PuTTY,plink.exe 的路径位于 SourceTree 文件夹下,即 C:\Users\{user_name}\AppData \Local\SourceTree\app-3.3.8\tools\putty\,作为实用程序与 SourceTree 一起提供......
  • 如果关注那篇文章并且您使用的是 id_ed25519 密钥,则需要先将其转换为可以使用 PuTTY 的 .ppk 文件,但需要使用 0.71 或更高版本的 puttygen。 exe,否则它不会让您加载文件进行转换。
【解决方案2】:

还有另一种方法,对我有用。

  1. 使用另一个 ssh 客户端连接到 Git 存储库,例如 ssh.exe。接受连接。它将生成 known_hosts 文件。
  2. known_hostsid_rsa 文件复制到 C:\Users\[UserName]\.ssh\
  3. 完成。即使没有 start-ssh-agent。

似乎 VS2017 自己运行 ssh 连接,所以它忽略了 ssh-add 添加的密钥,并且只使用默认路径的密钥

【讨论】:

  • 但它真的适用于需要 SSH 密钥才能连接的存储库吗?即使密钥没有密码,将 id_rsa 放在 C:\Users[UserName]\.ssh\ 对我也不起作用,除非我将密钥加载到身份验证代理中,否则 VS 仍然无法连接。
  • 是的,我在服务器上使用“git init --bare”创建存储库,并通过 ssh://server-ip/some-path/repository.git 访问它。 ssh-key 用于登录该服务器。
  • 如果删除 id_rsa 文件会失败?
  • 这似乎是最简单的解决方案,我在 Windows 上的 Ubuntu 上使用 Bash 复制了文件:cp ~/.ssh/* /mnt/c/Users/[My User]/.ssh/
  • 这很好用,非常感谢!虽然... VS 要求我每次连接到 Github 时都重新输入我的 id_rsa 密钥文件的密码。根据其他答案,不确定是否唯一的方法是连接到 WSL 的 ssh-agent 或 PuTTY 的 plink?
【解决方案3】:

这是一个解决方案,它允许通过 SSH 将 Visual Studio(和 Git)连接到多个存储库,必要时使用单独的私钥和 ssh 身份验证代理来处理密钥的密码。

这对企业用户有好处,因为您不需要在您的计算机上需要管理员权限来执行以下步骤。

在 Bitbucket 的示例中进行了解释,但可以扩展到 Github 和其他任何东西。

先决条件

  • 已安装 Visual Studio
  • Bitbucket 帐户

下载并安装 Git

在打开项目时,Visual Studio 会要求您下载并安装 Git 包。您可以使用 Visual Studio 通知中提供的链接或使用此 link 来执行此操作。

仅为当前用户安装 Git。 默认使用安装选项。

生成您的私钥/公钥对

  1. 使用 ssh-keygen.exe 应用程序找到 Git 文件夹。默认情况下是: "%LOCALAPPDATA%\Programs\Git\usr\bin\" 例如: “C:\Users\NSM\AppData\Local\Programs\Git\usr\bin\”
  2. 打开命令提示符并进入您找到的文件夹:

    cd "%LOCALAPPDATA%\Programs\Git\usr\bin\"
    
  3. 创建一个文件夹来存储您的密钥(如果它不存在)

    mkdir "%HOME%\.ssh"
    
  4. 生成新的 ssh 密钥:

    ssh-keygen -t rsa -b 4096 -C "<your email of id>" -f "%HOME%/.ssh/id_rsa_<file name>"
    

    例如:

    ssh-keygen -t rsa -b 4096 -C "nsm" -f "%HOME%/.ssh/id_rsa_nsm"
    

    建议指定他们的密钥密码。记住密码,忘记了就无法找回!

将您的公钥添加到 Bitbucket

  1. 打开您的 Bitbucket 帐户管理页面
  2. 打开 SSH 密钥 部分并点击 添加密钥
  3. "%HOME%/.ssh/" 文件夹中复制并粘贴生成的公钥的内容。例如:id_rsa_nsm.pub ssh-rsa AAAAB3Nza<skipped>BkPqxFQ== nsm
  4. 点击添加密钥按钮提交您的公钥

配置 ssh 以将您的密钥用于 Bitbucket 源代码请求

"%HOME%/.ssh/" 文件夹中创建 config 文件,内容如下:

    AddKeysToAgent yes

    Host <Bitbucket FQDN or any label>
      HostName <Bitbucket FQDN>
      User git
      IdentityFile ~/.ssh/id_rsa_<file name>

例如:

    cd %HOME%/.ssh/
    type config

输出:

    AddKeysToAgent yes

    Host bitbucket.org
      HostName bitbucket.org
      User git
      IdentityFile ~/.ssh/id_rsa_nsm

AddKeysToAgent yes 选项将根据需要将配置的私钥添加到 ssh 身份验证代理

将 Git 配置为使用 ssh 身份验证代理

每次使用私钥时都输入密码是一项繁琐的负担。为避免这种情况,我们将使用 ssh 身份验证代理

  1. 在找到 ssh-keygen 实用程序的文件夹中(默认为: "%LOCALAPPDATA%\Programs\Git\usr\bin\"),创建 ssh.cmd 文件,内容如下:

    @echo off
    setlocal enabledelayedexpansion
    
    ::: File storing SSH_AUTH_SOCK and SSH_AGENT_PID of the running agent
    set __ssh_agent=%HOME%/.ssh/agent.env
    
    if exist %__ssh_agent% goto loadenv
    
    :startagent
    echo Starting SSH Authentication Agent...
    ssh-agent > %__ssh_agent%
    
    :loadenv
    ::: Loading the agent environment variables from 2 first lines of agent.env:
    ::: SSH_AUTH_SOCK and SSH_AGENT_PID
    set /a __count=0
    for /f "tokens=1 delims=;" %%a in (%__ssh_agent%) do (
      if !__count! LSS 2 (
        set %%a
        set /a __count+=1
      ) else (
        goto endloadenv
      )
    )
    :endloadenv
    
    ::: Checking the agent is running
    for /f "tokens=1 delims=, usebackq" %%a in (`TASKLIST /FI "PID eq %SSH_AGENT_PID%" /FO CSV /NH`) do (
      if not %%a == "ssh-agent.exe" goto startagent
    )
    
    :startssh
    ::: Run ssh, passing to it all command line parameters
    ssh.exe %*
    

    此脚本将在 ssh.exe 执行之前加载 ssh 身份验证代理,并允许 ssh.exe 通过 SSH_AUTH_SOCK 环境变量中指定的套接字与其通信。

  2. 从命令提示符执行以下命令:

    git config --global core.sshCommand '%LOCALAPPDATA%/Programs/Git/usr/bin/ssh.cmd'
    

使用 Bitbucket 提供的链接为您的本地存储库创建一个远程

将链接中的 FQDN 替换为您在 ./ssh/config 文件中提供的标签。这将允许您在连接到 Bitbucket 或 Github 存储库时使用具有多个键的配置部分

全部完成

【讨论】:

  • 这是使用 VS 和凭证管理器运行时的最佳解决方案。与选美解决方案不同,如果密钥未加载到代理中,系统会提示您输入密码,同样通过调整 cmd 文件,您还可以在几秒钟后删除密钥。我在这些指令中遇到了一些问题,但归根结底,这是我正在寻找的让 ssh 代理在 VS 中工作的解决方案。首先,我已经有了 .ssh 文件夹,但默认情况下 %HOME% 不存在,您需要使用 %HOMEPATH% 或 %USERPROFILE% 或使用 bash shell 并根据需要使用 ~/ 即 mkdir ~/.ssh
  • 接下来将命令放入程序文件等中可能会在公司环境中出现问题,因为必须正式安装所有软件,如果是这样,您可以将其放入 .ssh 作为保留它的合理位置。跨度>
  • 我在尝试克隆 repo 时遇到错误 - %PROGRAMFILES'(X86')%/Git/usr/bin/ssh.cmd: line 0: fg: no job control 你知道吗发生这种情况的任何原因?
  • @HashCoder,我认为您正在尝试从 bash shell 中使用 Windows Subsystem for Linux 中的此解决方案。 Bash 期望 ssh.cmd 是一个 shell 脚本,但无法运行它
  • @SergeyNudnov 我尝试使用 Visual Studio 克隆 SSH URL,并在核心 sshcommand 下的 gitconfig 文件中提到了 ssh.cmd 的路径
【解决方案4】:

对我来说(Visual Studio 2019),它在添加一个新的系统范围的环境变量 GIT_SSH 和值 C:\Program Files\TortoiseGit\bin\TortoiseGitPlink.exe(TortoiseGit 的 plink)TortoiseGitPlink.exe 后工作。 Putty 的 plink.exe 对我没有用。也许是因为我使用的是 TortoiseGit。添加后,记得重启 Visual Studio。

【讨论】:

    【解决方案5】:

    好吧,我找不到使用 VS 2017 配置 Git 存储库的直接方法,因为克隆选项只接受 URI 而不是 SSH。

    我做了以下事情:

    1. 使用 Git Bash 生成 SSH 密钥,并将 Git 服务器与 Git bash 生成的密钥同步。您应该在“设置”下提供公钥。
    2. 下载Sourcetree客户端并配置SSH密钥选项->通用->SSH客户端配置->需要给出Git bash生成的私钥
    3. 使用源代码树克隆客户端并从 Visual Studio 打开相同的解决方案。推/拉将照常工作。

    使用 Git Bash 生成您可能会找到 here 的密钥。

    【讨论】:

    • 克隆 SSH 存储库路径在 VS2017 15.9.2 中对我有用,所以现在看起来已经修复了。作为为 Windows 安装 Git 的替代方法,您还可以使用 Windows Subsystem for Linux 生成密钥等,然后在您的主目录中为内置的 VS ssh 客户端设置 .ssh/config (如 @Raven 的答案 - 只是请记住,VS 会查看您的 Windows 主目录,而不是 WSL 目录)。
    • 每个存储库都有一个不同的 URI 来使用 SSH 克隆它 - 但它仍然是一个 URI。您可以通过在 Github 的“克隆或下载”弹出窗口中单击“使用 SSH”和“使用 HTTPS”来找到两者。
    【解决方案6】:

    这种方式对我有用(VS 2017 / Win7):

    1. 我安装了git-scm 并与之连接。
    2. 完成(无需复制,即可使用)

    【讨论】:

      【解决方案7】:

      在 VS2017 中

      我有同样的问题。我尝试了一些解决方法:

      1. 删除了 Visual Studio 安装程序中的“git for windows”并删除了控制面板上的 git
      2. 安装了两个。
      3. 尝试了一些 ssh 设置

      但没有解决我的问题。 我打开了“Visual Studio Installer”修复了。它解决了。

      【讨论】:

        猜你喜欢
        • 2019-11-01
        • 2019-12-13
        • 2020-10-30
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-12-24
        • 1970-01-01
        • 2013-05-25
        相关资源
        最近更新 更多