3

我可以使用 hgweb.cgi 通过 http:// 成功访问存储库:

$ 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 的根目录是上一个目录。)

4

2 回答 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 可执行文件。

于 2012-06-09T23:28:27.080 回答
0

使用 hg 的“详细”选项后,发现了两个问题:

  1. 当通过 ssh 调用时,hg 会自动尝试运行 hg 服务器,因此无需通过 hgweb.cgi。
  2. hg 命令的路径(在 .bash_profile 中设置)没有用于非交互式 SSH 命令。我不得不将 hg 的路径放在某个地方,例如 .bashrc。

修复所有这些,以下命令按预期工作:

hg clone ssh://myname@mydomain.com/public_html/myrepo
于 2012-06-09T14:35:50.857 回答