【问题标题】:Accessing Mercurial repositories over SSH通过 SSH 访问 Mercurial 存储库
【发布时间】:2012-06-09 13:27:39
【问题描述】:

我可以使用 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 的根目录是上一个目录。)

【问题讨论】:

  • 好的,这表明了相当多的感谢。我可以看到'hg clone'实际上在远程服务器上调用了hg,所以我不需要通过hgweb.cgi。现在看来我只需要弄清楚如何在 SSH 环境中为 hg 设置正确的 PATH,因为仍然找不到 hg。

标签: mercurial ssh


【解决方案1】:

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 以myname 身份登录到mydomain.com 服务器,它可以在/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 可执行文件。

【讨论】:

    【解决方案2】:

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

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

    解决所有问题后,以下命令按预期工作:

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

    【讨论】:

      猜你喜欢
      • 2011-05-24
      • 1970-01-01
      • 2012-04-04
      • 2019-12-29
      • 2014-11-01
      • 1970-01-01
      • 1970-01-01
      • 2016-06-04
      • 2010-12-16
      相关资源
      最近更新 更多