2012-06-09 164 views
3

水銀庫我可以成功訪問存儲庫通過http://使用hgweb.cgi:訪問通過SSH

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

我也能成功ssh到mydomain.com使用密碼。

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

但是,我不能推斷如何通過SSH服務存儲庫。例如,這不起作用:

$ hg clone ssh://[email protected]/public_html/scgi-bin/hgweb.cgi/myrepo 
[email protected]'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 [email protected]「hg -R ... serve --stdio」'這是一個很大的提示,不工作。 – msw

+0

好的,這顯示了很多謝謝。我可以看到'hg clone'實際上在遠程服務器上調用hg,所以我不需要通過hgweb.cgi。現在看來我只需要弄清楚如何在SSH環境中爲hg設置正確的PATH,因爲仍然沒有找到hg。 – jontyc

回答

4

HTTP是不一樣的SSH。 HTTP是一種無狀態的,基於請求的傳輸協議。 SSH是一種在兩臺機器之間建立永久性,有狀態連接的協議。

您的HTTP URL看起來像存儲庫的完整路徑,但它通過一個web服務器,它正在執行hgweb.cgi腳本,並將myrepo作爲參數傳遞給它。 hgweb.cgi腳本在服務器上運行Mercurial以對抗myrepo存儲庫(它從服務器上的配置文件中提取實際位置)。該命令鏈是這樣的:

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

您使用的是第二個例子中的SSH URL告訴水銀登錄到mydomain.com服務器myname,它可以在/public_html/scgi-bin/hgweb.cgi/myrepo找到庫。很可能,這不是你的回購所在的地方。該命令鏈是這樣的:

Local Mercurial -> SSH -> Server file system 

您需要更改SSH URL使用絕對路徑回購在服務器上:

hg clone ssh://myn[email protected]/path/to/myrepo 

它也像服務器找不到Mercurial可執行文件。

0

在使用時的汞的 'verbose' 選項,顯露了兩個問題:

  1. 當通過ssh調用時,hg自動嘗試運行hg服務器,因此不需要通過hgweb.cgi進行操作。
  2. hg命令(在.bash_profile中設置)的路徑未用於非交互式SSH命令。我不得不把路徑放到某個地方,比如.bashrc。

解決所有這些問題了,下面的命令和預期一樣:

hg clone ssh://[email protected]/public_html/myrepo