通过SSH访问Mercurial存储库

3

我可以成功地使用hgweb.cgi访问http://上的仓库:

$ hg clone http://mydomain.com/scgi-bin/hgweb.cgi/myrepo

我可以使用密码成功远程登录到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的根目录是向上的一个目录。)


1
如果你使用 hg clone --verbose ,它将会显示类似于 running ssh myname@mydomain.com "hg -R ... serve --stdio" 的内容,这是提示出现问题的重要线索。 - msw
好的,非常感谢,这揭示了很多信息。我可以看到'hg clone'实际上在远程服务器上调用了hg,所以我不需要通过hgweb.cgi进行操作。现在似乎我只需要解决如何在SSH环境中设置正确的PATH以便找到hg即可。 - jontyc
2个回答

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更改为在服务器上使用仓库的绝对路径:
hg clone ssh://myname@mydomain.com/path/to/myrepo

似乎服务器找不到Mercurial可执行文件。

0

使用 hg 的“verbose”选项时,出现了两个问题:

  1. 当通过 ssh 调用时,hg 自动尝试运行 hg 服务器,因此无需通过 hgweb.cgi 进行访问。
  2. 在非交互式 SSH 命令中未使用设置在 .bash_profile 中的 hg 命令的路径。我必须将 hg 的路径放在其他地方,例如 .bashrc。

修复所有问题后,下面的命令按预期工作:

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

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