在Windows上使用SSH进行Git操作

57

我仔细阅读了 Tim Davis 提供的优秀指南,其中介绍了如何在Windows上配置Git以使用SSH来创建Git服务器,从而实现DVCS的主要存储库。

我正在创建我的项目克隆。我已经完成了所有步骤直到这一点,但是我不断收到来自TortoiseGit的以下提示:

git.exe clone -v “ssh://Administrator@127.0.0.1:22/SSH/Home/administrator/myapp.git” “E:\GitTest\myapp”

bash: Administrator@127.0.0.1: command not found
Initialized empty Git repository in E:/GitTest/myapp/.git/
fatal: The remote end hung up unexpectedly
Success

而且没有任何东西被克隆。

顺便说一下:TortoisePLink在此消息出现之前弹出,并询问我:“login as:”(我认为这些信息已经包含在命令中了,即 Administrator@blahblah)。

我的主目录变量设置正确:

从Git Bash shell运行:

echo $HOME
/c/SSH/home/Administrator

我也尝试使用Putty的plink代替TortoisePLink(在Git和TortoiseGit的安装中都是如此)。这一次,错误被缩小到:

git.exe clone -v “ssh://Administrator@127.0.0.1:22/c:/SSH/Home/administrator/myapp.git” “E:\GitTest\myapp”

Initialized empty Git repository in E:/GitTest/myapp/.git/
fatal: The remote end hung up unexpectedly

1
你的问题中的链接已经失效了... - enigmaticPhysicist
1
时光倒流机来拯救了!http://web.archive.org/web/20170507103323/http://www.timdavis.com.au/git/setting-up-a-msysgit-server-with-copssh-on-windows/ - Harry Mallon
链接已修复,指向文章的新页面。然而,Git for Windows 现在捆绑了 OpenSSH,这可能比 Cygwin 的 OpenSSH 更好。 - Michael Burr
自 Putty 0.77 版本开始,无需使用 PLINK 和其他额外工具,操作变得更加容易。请参见 https://dev59.com/LFIH5IYBdhLWcg3wAHn2#74394215。 - D. Lohrsträter
7个回答

125

在我意识到显而易见的答案之前,我为解决这个问题奋斗了几个小时。我的问题是我在生成密钥时使用的ssh实现与我使用git时使用的不同。

我使用命令提示符中的ssh-keygen生成密钥,但当我尝试使用“git clone ssh:// ...”时,我得到了与您相同的结果,即要求输入密码和消息“fatal: The remote end hung up unexpectedly”。

通过执行Windows中的“where”命令来确定Windows正在使用哪个ssh。

C:\where ssh
C:\Program Files (x86)\Git\bin\ssh.exe

第二行告诉你将要执行哪个确切的程序。

接下来需要确定git正在使用哪个ssh。通过以下方式找到:

C:\set GIT_SSH
GIT_SSH=C:\Program Files\TortoiseSVN\bin\TortoisePlink.exe

现在你看到了问题所在。

要纠正这个问题,只需执行:

C:\set GIT_SSH=C:\Program Files (x86)\Git\bin\ssh.exe

检查更改是否已应用:

C:\set GIT_SSH
GIT_SSH=C:\Program Files (x86)\Git\bin\ssh.exe

现在,git 将能够使用您之前生成的密钥。

这个修复方法目前只适用于当前窗口。要完全修复它,您需要更改环境变量。

  1. 打开Windows资源管理器
  2. 右键单击计算机并选择属性
  3. 点击左侧的高级系统设置链接
  4. 点击环境变量...按钮
  5. 在系统变量部分,选择GIT_SSH变量并按Edit...按钮
  6. 更新变量值。
  7. 点击OK关闭所有窗口

现在,您打开的任何未来命令窗口都将具有正确的设置。


1
我一直在Windows10上使用git-bash进行git远程推送/拉取,直到刚才出现了“错误:无法生成ssh:没有这样的文件或目录”的错误。上面的答案启发了我的解决方法,在git-bash中:export GIT_SSH=/c/Program\ Files/Git/usr/bin/ssh.exe,然后git push origin神奇地开始工作了。谢谢! - Emily
11
现在Windows 10已经包含了OpenSSH,解决这个问题的方法是告诉Git使用OpenSSH。默认情况下,Windows上的Git会使用自带的ssh.exe。要进行修复,请使用以下命令:setx GIT_SSH C:\Windows\System32\OpenSSH\ssh.exe。如果要为计算机上的每个人进行修复,请在 setx 命令后加上 /M 标志。 - Faustin Carter
1
上述过程适用于2022年的Windows 10。请参考此主题了解如何启用OpenSSH认证代理(查看最受欢迎的答案)。 - Foxy Fox

22

由于在搜索结果中,关于在Windows中使用SSH使git和github正常工作的问题一直存在(并且因为我不需要上述指南中的任何内容),我添加了以下简单的解决方案。

(微软表示他们正在努力将SSH添加到Visual Studio中,而GitHub for Windows仍然不支持SSH...)

1. 我安装了“Git for Windows”(包括ssh和一个bash shell)

https://git-scm.com/download/win

2. 从包含的bash shell(对我来说,它安装在:C:\Program Files\Git\git-bash.exe

cd 到您想要保存repo的根级别(类似于:C:\code\github\),并且

键入:

eval $(ssh-agent -s) && ssh-add "C:\Users\YOURNAMEHERE\.ssh\github_rsa"

3. 输入:(repo的SSH链接)

git clone git@github.com:RepoName/Project.git


你有没有想过为什么要用 eval 包装 ssh-agent 才能使其工作? - Fractalf
5
@Fractalf 这就是设计的方式。ssh-agent -s 会生成Shell代码,而eval "$(ssh-agent -s)" 则会运行生成的代码。 - shadowtalker
1
这是唯一对我有效的解决方案,其他所有关于在Windows上克隆的内容都说要使用https://格式,而这种方式从不使用密钥身份验证。谢谢! - Jock
'eval $(ssh-agent -s) && ssh-add "C:\Users\YOURNAMEHERE.ssh\github_rsa"' 这段代码是做什么用的?为什么需要它?我想使用 Windows 中包含的 OpenSSH,但在成功登录后,克隆操作被取消,并显示 "fatal: ''C:/path to bare git repository'' does not appear to be a git repository" 的错误信息。 - The incredible Jan

9

您在这里使用了智能引号而不是"

git.exe clone -v “ssh://
                ^^^ 

请确保使用普通的双引号。


6

我在C:/Program Files/Git/usr/bin目录下找到了ssh.exe


4
如果已经安装了Git for Windows,运行Git Bash shell:
  bash

您可以在Bash shell中运行ssh(Bash知道ssh的路径)

要了解ssh的确切路径,请在Bash shell中运行“where”命令:

  $ where ssh

你需要了解的是:

  c:\Program Files\Git\usr\bin\ssh.exe

太棒了!!非常有用 - gfan

3

当我输入 where ssh 的时候,它会显示多个 ssh.exe

user@pc MINGW64 /c/dev/
$ where ssh
C:\Users\user\AppData\Local\Programs\Git\usr\bin\ssh.exe
C:\Windows\System32\OpenSSH\ssh.exe

删除/移动这些exe可以帮助解决问题:

# copy from
# C:\Users\user\AppData\Local\Programs\Git\usr\bin
# to something like
# C:\Users\user\AppData\Local\Programs\Git\usr\bin\backup-ssh
ssh-agent.exe
ssh.exe
ssh-add.exe

这对我解决了问题。

我使用了mv命令来重命名每个文件。例如:"mv ssh.exe backup_ssh.exe",请确保以管理员模式运行bash。 - Isuru Madusanka

2
我曾试图采用以上答案解决我的问题,但不知何故它并没有奏效。我转而使用了Git扩展,并按照以下步骤进行了操作:
  1. 进入“工具 -> 设置 -> SSH -> 其他ssh客户端”
  2. 将值设置为“C:\Program Files\Git\usr\bin\ssh.exe”
  3. 应用
我想这些步骤与上面解释的是一样的,唯一的区别是我使用了Git扩展用户界面而不是终端。希望这能帮助到您。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接