Windows TortoiseHg plink在克隆/推送后挂起

时间:2012-03-05 13:54:11

标签: windows ssh tortoisehg

我们拥有一个全Windows网络,并且我试图通过SSH获取Tortoise Mercurial并为我们的小团队使用中央回购。我可以让它在大多数情况下工作,但plink / tortoiseplink挂起后成功执行命令(克隆/推送等)。

我已经在Widnows 2008 rc2服务器和Tortoise Hg上建立了Freesshd。我使用PuttyGen在服务器上生成了公钥/私钥(在客户端上生成了问题)。私钥我复制到我的客户端并更新了mercurial.ini。公钥我重命名并更新了Freesshd以指向包含公钥的文件夹。 在客户端,我已经使用Pageant注册了我的私钥,在Putty中创建了一个会话,并将其指向我的私钥并保存。 当我使用Putty进行初始连接时,事情开始变得奇怪。

我收到用户名的命令提示符(没有提示输入密码),并且在命令提示符下(身份验证后),我无法输入。 也许是Putty的一个问题。我将尝试使用Tortoise(TortoisePlink.exe)。

在mercurial.ini中我有:     [UI]     ssh =" C:\ putty \ TortoisePlink.exe" -ssh -2 -batch -C -i C:\ Users \ Jude.ssh \ JudePrivate.ppk

如果我使用控制台,我可以克隆回购,但它会在做完所有事情后挂起。使用--debug,最后一行是:     更新了3个文件,合并了O个文件,删除了0个文件,未解决了0个文件

当文件确实得到克隆时,我期望的那种。但后来我无能为力。 Ctrl+C什么也没做,我必须杀掉这个过程。 (顺便说一句,然后在命令提示符处显示Ctrl ^ C以及键盘糖化的其余部分。)

repo被克隆,文件的正确版本出现,但控制台窗口没有关闭或让我重新控制。

如果我尝试使用Hg Workbench,我会遇到类似的问题。我可以克隆和推送 - 它实际上发生 - 但使用GUI我得到:

% hg --repository C:\repositories\HgTest push --debug          
ssh://Jude@dev01:22/d:/repositories/hgtest
pushing to ssh://Jude@dev01:22/d:/repositories/hgtest
running "C:\putty\TortoisePlink.exe" -ssh -2 -batch -C -i
C:\Users\Jude\.ssh\JudePrivate.ppk Jude@dev01 -P 22 "hg -R d:/repositories/hgtest serve --stdio"
sending hello command
sending between command
remote: 145
remote: capabilities: lookup changegroupsubset branchmap pushkey known getbundle unbundlehash batch stream unbundle=HG10GZ,HG10BZ,HG10UN httpheader=1024
remote: 1
query 1; heads
sending batch command
searching for changes
all local heads known remotely
no changes found
sending listkeys command
checking for updated bookmarks
sending listkeys command

Workbench顶部的绿色条表示"推送到ssh:// Jude @ dev01:22 / d:/repositories/hgtest ...。"和底部的状态栏一样。我整个周末都这样离开了,当我回来时它仍然像它一样。我仍然可以使用Hg Workbench(有点)但不能使用pull / push / clone。尝试关闭Hg Workbench会生成消息(在状态栏中)Sync tab cannot exit,我无法关闭应用程序。杀死TortoisePlink.exe(或Plink.exe,无论我尝试哪个)都可以释放我可以使用的应用程序或正常关闭它。

最初我认为TortoiseHg或TortoisePlink存在问题,但从Putty网站下载Plink会产生同样的问题。

澄清:
  - 我可以通过SSH推送/克隆,没有密码提示
  - 我可以通过命令行或Hg Workbench执行此操作   - 无论我使用哪种方法(或Plink.exe或TortoisePlink.exe),都需要手动杀死该进程。

使用的软件+版本
客户端(Windows Vista 32位)
Tortoise Hg 2.3(merc 2.1,Python 2.6.6)
Plink 0.62
服务器 - (Windows 2008服务器rc2)
FreeSSHd 1.2.4
与上面相同的乌龟

许多搜索都没有任何用处。我已经尝试了所有我已经看到过的建议(即使有些相关),但无济于事。由于实际功能正常,我假设我已经正确设置了密钥,SSH,Tortoise等。

我希望我在某个地方错过了一个简单的选项,但我怀疑它正在等待某种用户提示。

手指交叉:)

=== UPDATE ===

我找到了Putty的事件日志(右键点击putty控制台窗口,瞧,"事件日志"选项。一旦我加载了会话并点击打开,我得到了控制台窗口和login as:提示。输入我的名字并点击返回后,我得到:

Reading private key file "C:\Users\Jude\.ssh\JudePrivate.ppk"
Pageant is running. Requesting keys.
Failed to get reply from Pageant
Offered public key
Offer of public key accepted
Sent public key signature
Access granted
Opened channel for session
Allocated pty (ospeed 38400bps, ispeed 38400bps)
Started a shell/command

在此阶段我将命令提示符更改为c:\Windows\system32>并且无法输入任何内容。

===更新2 ===

使用 plink 我在控制台执行以下操作:

plink -v -ssh Jude@dev01 "cmd /c echo hello"

,以及所有信息-v给出,我看到hello然后Server sent command exist status 0Disconnected: All channels closed。这就是我所期望的。

如果我用tortoiseplink,`tortoiseplink-v -ssh Jude @ dev01" cmd / c echo hello"'我看不到任何返回或写入窗口的内容,我再次收到命令提示符。

这意味着SSH和别名(dev01)一样工作。但是在使用TortoisePlink时我应该看到什么吗?

再次键入hg clone --verbose -- ssh://Jude@dev01/d:/repositories/hgtest C:\repositories\test获取文件,将它们复制到测试文件夹,但不会返回命令提示符。最后一行是3 files updated...等。

===更新3 ===

似乎hg.exe是由FreeSSHd在服务器上生成的,它确实关闭/完成。当hg.exe进程在服务器上被终止时,客户端(控制台/克隆对话框)会正常运行并完成命令。

澄清:

  1. 我在命令行或HG Workbench中使用clone并指定repo别名
  2. 根据日志,一切都很好,我已通过身份验证,文件通过SSH下拉并复制到我在1中指定的本地仓库
  3. 此时它会挂起 - 无论是控制台还是HG Workbench,还是右键单击/克隆选项。
  4. 在服务器上使用Process Explorer可以杀死由FreeSSHd服务生成的hg.exe
  5. 一旦我这样做,客户说"命令成功完成"。
  6. 所以,现在看来服务器上的Tortoise Hg存在问题。也许FreeSSHd和Tortoise不能很好地在一起玩......我想我会重新安装所有东西......

    ===更新4 ===

    似乎我不是唯一一个有这个问题的人。我之前已经发现了这个,但当时并没有相关性。但是,现在我遇到了同样的问题:Mercurial over ssh client and server on Windows 这个问题没有解决(两年前),所以我要保持这个问题吗?

1 个答案:

答案 0 :(得分:2)

  1. 首先 - 阅读文档!

    hg help urls
    Valid URLs are of the form:
    
    ....
    
    ssh://[user@]host[:port]/[path][#revision]
    
  2. Plink使用-l选项作为用户名

  3. 使用纯TortoisePlink调试成功的ssh-connect(和可用路径),删除所有不必要的选项