6

我有一个 Git 存储库,我使用类似于以下的路径提取它:

git pull ssh://username@host.com:1234/path/to/repository.git

当 GitExtensions 然后尝试使用 plink 从存储库中提取时,它会进行以下调用:

plink -T username@host.com:/path/to/repository.git

这最终会失败,因为它实际上是在 ping 端口 #22,而不是 #1234。

正确的呼吁是

plink -T -P 1234 username@host.com:/path/to/repository.git

如果我在 ~/.ssh/config 中创建一个别名“hostCom”,如果我这样做,它似乎可以正常工作(连接到 #1234):

plink -T username@hostCom

但是,只要我也添加了 Git 存储库的路径,它就会再次转到 #22。

我尝试的另一个选择是在 PuTTY 中创建一个会话。让我们称它为“hostPutty”,并在那里设置默认端口,等等。底线最终是一样的:不能将 Git 存储库的路径与自定义端口结合起来。

如何组合所有部分以使其工作?

OpenSSH怎么能解决这个问题,而 PuTTY 却不能呢?OpenSSH 的唯一问题是,它在每次连接尝试时都会询问我私钥的密码(而且我不想在没有密码的情况下创建私钥)。

4

2 回答 2

11

我想通了。

这就是让我走错路的原因:

  • 不要在 PuTTY 中创建任何会话,如此处所述
  • 不要使用您可能在文件~/.ssh/config中定义的任何主机别名

以下是如何让它工作:

  • 显然确保将 GitExtensions 设置为使用 PuTTY,而不是 OpenSSH
  • 确保plink.exe(与 GitExtensions 一起可用或专门与 PuTTY 一​​起安装的那个)位于没有空格的路径中
  • 将环境变量%GIT_SSH%设置为指向plink.exe(默认情况下它可能指向ssh.exe),确保没有撇号,因为该值将“按原样”使用(这就是为什么你可以' t 使用上述空格)
echo %GIT_SSH%

C:\tools\PuTTY\plink.exe
  • 在上面的示例中,使用“full”命令进行拉取,没有任何允许您不指定端口等的主机别名。如果端口丢失,并且只有一个冒号,Git 将其视为路径分隔符,并将ssh视为端口分隔符(因此它们咬得相当糟糕)。

    git clone ssh://username@host.com:1234/path/to/repository.git

如果你这样做了,Git 和 plink 实际上会解决问题!

如果您不这样做,您可能会遇到各种问题,例如:

  • 我让%GIT_SSH%指向ssh.exe并使用主机别名而不是路径 incl。港口

ssh.exe": hostPutty:path: no address associated with name
fatal: 远端意外挂断

  • 在 %GIT_SSH% 中使用了撇号

错误:无法生成“C:\tools\PuTTY\plink.exe”:没有这样的文件或目录
致命:无法分叉

于 2012-09-06T18:45:04.893 回答
1

对我来说,我不断收到主机名不存在的错误。在尝试了有关此线程和其他线程的大量建议后,我检查了我的远程 URL,这是罪魁祸首。如果您使用的是 PuTTY,请确保它以git@github.com开头,而不是https://github

这是一个如何在 Git 扩展中检查的示例

于 2015-11-25T23:43:39.477 回答