在Benjamin指出HTTP服務CGI腳本之後,我決定試一試,並設法通過HTTP託管一個存儲庫。 Benjamin鏈接的The Redbook對兩篇Mercurial wiki文章有很大的幫助。其中一個描述Mercurial publishing一般,另一個包含step by step設置HgWebDir CGI腳本的說明。
這些說明並非完全萬無一失,儘管如此,我不得不捅一下。最有可能的是我運行64位Vista。下面的說明記錄了我所做的。現在,我已經完成了一次,我可能會以另一種順序做事情,所以不要考慮這些一步一步的指示。
水銀
首先,我所獲得的水銀二進制從中得到安裝到d:\dev\Mercurial
http://mercurial.berkwood.com/。我使用hg init
創建了一個存儲庫,用於d:\dev\testRepo
存儲庫下的測試。 d:\dev\Mercurial\library.zip
包含CGI腳本所需的Mercurial庫文件,因此它們被提取到d:\dev\Mercurial\library
。起初令我困惑的是,當我打開zip文件時,收到一條錯誤消息,但沒有看到任何內容。只是提取文件到一個目錄工作。
對於網頁腳本,我下載了包含hgwebdir.cgi的Mercurial source,它已被移動並重命名爲d:\dev\Mercurial\webroot\hgwebdir.py
。逐步文章包含有關修改Windows的hgwebdir腳本的很好說明。它們還含有指令,這在我的情況下結束了看起來像這樣hgweb.config:
[paths]
/hg/hgwebdir.py/test = D:\dev\Mercurial\testRepo
而且庫希望下面的配置,所以我可能會推動有沒有SSL。注意我正在使用基本身份驗證來驗證用戶當前。我曾在D:\dev\Mercurial\testRepo\.hg\hgrc
創建的配置,並添加以下行吧:
[web]
allow_push = *
push_ssl = false
的Python
CGI腳本是一個Python腳本,因此需要Python。 Python版本執行它似乎很挑剔。其中一篇文章提到運行它需要用於構建Mercurial的相同版本。最後,我在Python 2.6 x64,Python 2.4,Python 2.5 x64中使用了Python 2.5 x86。
IIS
兩件事情我錯過了,只好安裝了CGI支持和基本身份驗證。這兩個都是通過控制面板,程序和功能安裝的。完成安裝後,我在IIS中創建了一個虛擬目錄(後來我更改爲一個應用程序),指向D:\dev\Mercurial\webroot
。虛擬目錄需要一個CGI處理程序來處理* .py文件,這些文件可以從Handler Mappings中添加。該可執行文件是D:\dev\SDKs\Python25_x86\Python.exe %s
。一旦IIS有權訪問webroot目錄,我可以導航到http://localhost/hg/hgwebdir.py/test並查看存儲庫。
所以現在讀訪問正在工作。當我嘗試推送到存儲庫時,收到奇怪的錯誤消息,告訴我它不是真正的存儲庫。
經過一個小時的調試,我最終複製了webroot下的整個D:\dev\Mercurial\library\mercurial
樹,以便Python可以找到D:\dev\Mercurial\webroot\mercurial\hgweb\hgwebdir_mod.pyc
。此Wireshark在堆棧跟蹤中報告訪問被拒絕錯誤之後。不知道究竟是什麼原因,而是將虛擬目錄改爲IIS中的應用程序,並將其移動到使用本地系統帳戶運行的應用程序池的頂部,訪問被拒絕的錯誤消失了。
另外在某些時候,我給了HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\WinSock2\Parameters
註冊表鍵更多權限,以便IIS可以訪問它。懷疑它使用本地系統帳戶後需要這些。
一旦完成這些工作,就可以使用hg push http://localhost/hg/hgwebdir.cgi/test
正在工作!
問題和解決
- 在哪裏可以找到的庫文件。
- 它們在Mercurial安裝文件夾下的library.dll中。即使我的解壓縮程序拒絕查看它的內容,我也只能提取它們。
- 如何獲得Python的腳本來運行
- 下載正確的Python版本的x86架構的腳本使用一些86庫。正確的Python版本取決於Mercurial版本。對於1.2.1,它是Python 2.5 x86。
- 另外,你可以嘗試從你想要的任何Python版本的源碼構建Mercurial,但在我的情況下,當構建擴展時失敗。
- 如何設置CGI在IIS
- 首先確保CGI安裝在IIS。 Benjamin發佈的IIS說明中並沒有假設這是真的。
- 在IIS處理程序映射中爲* .py創建一個新的模塊映射。正確的模塊是
CgiModule
和可執行是你的Python可執行+%S
- 如何讓CGI腳本寫入倉庫
- 確保腳本有它需要的一切。我不得不將
library\mercurial\hgweb\hgwebdir_mod.pyc
移到另一個地方。
- 確保腳本擁有它想要的位置的權限。我通過爲使用本地系統帳戶的CGI腳本創建新的應用程序池,將虛擬目錄轉換爲IIS中的應用程序並選擇新的應用程序池來解決此問題。
您可能要現在更新問題,你已經看到「hg serve」如何能夠接受推送。 – 2009-05-29 20:47:04
太棒了。感謝您的詳細說明! – mmacaulay 2010-04-26 18:16:57