在 Benjamin 指出 HTTP 服务 CGI 脚本之后,我决定尝试这些并设法获得一个通过 HTTP 托管的存储库。本杰明链接的红皮书和两篇 Mercurial wiki 文章一样有很大帮助。一个描述一般的Mercurial 发布,另一个包含设置 HgWebDir CGI 脚本的分步说明。
这些说明并非完全万无一失,所以我不得不四处寻找。很可能是因为我正在运行 64 位 Vista。下面的说明记录了我所做的。既然我已经完成了一次,我可能会以另一个顺序做事,所以不要考虑这些分步说明。
水银
首先,我从http://mercurial.berkwood.com/获取了 Mercurial 二进制文件,该二进制文件安装到d:\dev\Mercurial
. 我d:\dev\testRepo
使用hg init
. d:\dev\Mercurial\library.zip
包含 CGI 脚本所需的 Mercurial 库文件,因此它们被提取到d:\dev\Mercurial\library
. 起初让我感到困惑的是,当我打开 zip 文件时,我收到一条错误消息并且看不到任何内容。只是将文件解压缩到一个目录就可以了。
对于 web 脚本,我下载了 Mercurial源,其中包含 hgwebdir.cgi,它被移动并重命名为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
. 虚拟目录需要一个用于 *.py 文件的 CGI 处理程序,该处理程序可以从处理程序映射中添加。可执行文件是D:\dev\SDKs\Python25_x86\Python.exe %s
. 一旦 IIS 获得了 webroot 目录的权限,我就可以导航到http://localhost/hg/hgwebdir.py/test并查看存储库。
所以现在读取访问正在工作。当我尝试推送到存储库时,我收到了奇怪的错误消息,告诉我它不是真正的存储库。
经过一个小时的调试,我最终将整个D:\dev\Mercurial\library\mercurial
树复制到了 webroot 下,以便 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 脚本运行
- 下载适用于 x86 架构的正确 Python 版本,因为该脚本使用了一些 x86 库。正确的 Python 版本取决于 Mercurial 版本。对于 1.2.1,它是 Python 2.5 x86。
- 或者,您可以尝试使用您想要的任何 Python 版本从源代码构建 Mercurial,但在我的情况下,这在构建扩展时失败了。
- 如何在 IIS 中设置 CGI
- 首先确保 CGI 安装在 IIS 中。本杰明发布的 IIS 说明中并未假定这是真的。
- 在 IIS 处理程序映射中为 *.py 创建一个新的模块映射。正确的模块是
CgiModule
并且可执行文件是您的 Python 可执行文件 + %s
- 如何允许 CGI 脚本写入存储库
- 确保脚本具有所需的一切。我不得不把它搬到
library\mercurial\hgweb\hgwebdir_mod.pyc
另一个地方。
- 确保脚本有权访问它想要的任何地方。我通过为使用本地系统帐户的 CGI 脚本创建一个新的应用程序池、将虚拟目录转换为 IIS 中的应用程序并选择新的应用程序池来解决这个问题。