通过SSH访问Mercurial存储库

时间:2012-06-09 13:27:39

标签: mercurial ssh

我可以通过http://使用hgweb.cgi:

成功访问存储库
$ hg clone http://mydomain.com/scgi-bin/hgweb.cgi/myrepo

我也可以使用密码成功ssh到mydomain.com。

$ ssh myname@mydomain.com
myname@mydomain.com's password:  xxxxxx
Last login: Sat Jun 9 .....
myname@mydomain.com [~]# ls public_html/scgi-bin
./ ../ hgweb.cgi*, hgweb.config

但是我无法推断出如何通过SSH提供存储库。例如,这不起作用:

$ hg clone ssh://myname@mydomain.com/public_html/scgi-bin/hgweb.cgi/myrepo
myname@mydomain.com's password: xxxxx
remote: stdin: is not a tty
remote: bash: hg: command not found
abort: no suitable response from remote hg!

我的结论是,与http://不同,ssh://不知道如何运行cgi脚本,这是正确的吗?有解决方案吗?

(顺便说一句:这是在共享主机上,http的根目录是public_html /,ssh的根目录是一个目录。)

2 个答案:

答案 0 :(得分:4)

HTTP与SSH不同。 HTTP是无状态的基于请求的传输协议。 SSH是一种在两台机器之间建立永久,有状态连接的协议。

您的HTTP URL看起来像是存储库的完整路径,但它通过Web服务器执行hgweb.cgi脚本,并将其作为参数传递给myrepo。 hgweb.cgi脚本在服务器上针对myrepo存储库运行Mercurial(它从服务器上的配置文件中提取实际位置)。命令链如下所示:

Local Mercurial -> HTTP -> Web Server -> hgweb.cgi > Server Mercurial

您在第二个示例中使用的SSH URL告诉Mercurial以mydomain.com身份登录myname服务器,它可以在/public_html/scgi-bin/hgweb.cgi/myrepo找到存储库。最有可能的是,这不是您的回购所在的地方。命令链如下所示:

Local Mercurial -> SSH -> Server file system

您需要更改SSH URL以使用服务器上repo的绝对路径:

hg clone ssh://myname@mydomain.com/path/to/myrepo

看起来服务器也找不到Mercurial可执行文件。

答案 1 :(得分:0)

使用hg的'verbose'选项后,发现了两个问题:

  1. 当通过ssh调用时,hg会自动尝试运行hg服务器,因此无需通过hgweb.cgi。
  2. hg命令的路径(在.bash_profile中设置)未用于非交互式SSH命令。我不得不把路径放到某处,例如.bashrc。
  3. 解决所有问题,以下命令按预期工作:

    hg clone ssh://myname@mydomain.com/public_html/myrepo