我假定你了解hg,了解python,理解nginx或者其他cgi/fcgi的配置过程。现在想用http发布自己的mercurial仓库,而且可能发布一群,怎么操作呢?

首先,复制模板文件过来,你可以挑选其中之一。以下是debian的文件位置,其他发布请自行查询。

/usr/share/doc/mercurial-common/examples/hgweb.wsgi
/usr/share/doc/mercurial-common/examples/hgweb.fcgi
/usr/share/doc/mercurial-common/examples/hgweb.cgi

我使用nginx+fastcgi模式部署,因此复制了hgweb.fcgi。我假定你的仓库在~/hg下面,有很多子仓库。复制hgweb.fcgi到~/hg/下,改名为hgweb.py,并修改以下两行。

config = "/path/to/you/config"
WSGIServer(application, bindAddress='hgweb.sock').run()

其中bindAddress为你需要监听的unixsocket路径,没有前缀表示在当前目录生成。而后建立配置文件,大概为以下内容。

[web]
allow_push = someone
push_ssl = false

[paths]
/hg/proj1=/path/to/proj1
/hg/proj2=/path/to/proj2

以上就完成了hgweb的服务配置,/hg/proj1是你的url映射路径,/path/to/proj1是物理路径。someone是允许进行push的人,而push_ssl是允许http推送。而后,启动服务。

python hgweb.py &
chmod 666 hgweb.sock

注意,这里要用screen之类的程序来启动hgweb,否则term关闭后服务进程停止,就没的玩了。修改权限是因为debian下的nginx使用www-data运行,对/home/user/hg没有读写权限,导致无法使用unixsock。

在nginx中做以下配置。

location ^~ /hg/ {
	limit_except GET {
		auth_basic "Restricted";
		auth_basic_user_file /home/user/hg/users;
	}
	fastcgi_pass unix:/home/user/hg/hgweb.sock;
	include fastcgi_params;
}

如果你不需要auth,可以自行参照nginx的配置修改。其他web服务器以此类推。重启服务后,http://domains/hg/proj1 就可以访问到proj1了。

当然,其实最后还要提一句,如果你不需要web界面,可以直接设定将文件内容直接发出去,这样也是可以做pull/push的。

参考: http://mercurial.selenic.com/wiki/PublishingRepositories