关于 Mercurial 的简介和基本操作,请参见小G的随笔《Mercurial(Hg)基本操作》。

我不再赘述 Mercurial 的各种让人振奋的特性,上一篇中我们提到了使用第三方版本库 bitbucket 来进行私有代码托管,但是小G在使用过程发现,由于天朝的网络问题,经常会使通信中断而导致同步操作失败。所以,这一篇,小G来和大家分享一下怎么搭建自己的 Mercurial 版本控制服务器。

1.环境和所需的工具

小G的服务器是 Windows Server 2008 R2 x64 版本, 对于软件小G一向是“喜新厌旧”的(^O^),所以下面所列出的这些工具,都是目前为止的最新版本:

  • TortoiseHg 2.6.2 with Mercurial (x86/x64) 从SkyDrive网盘下载 从Mercurial官网下载
  • Mercurial 2.4.2 Python 2.7 package (x86/x64)从SkyDrive网盘下载 从Mercurial官网下载
  • Python 2.7.3 (x86/x64)从SkyDrive网盘下载 从Python官网下载
  • IIS 的 URL Rewrite 组件 从SkyDrive网盘下载 从微软官网下载

2.操作步骤

1) 先安装 Python 2.7.3,接着安装 Mercurial 2.4.2 Python 2.7 package,再安装 TortoiseHg 2.6.2 with Mercurial ,最后安装 URL Rewrite 组件;也可以不按这个顺序安装,但是 Python 2.7.3 一定要在 Mercurial 2.4.2 Python 2.7 package 之前安装(推荐大家全部使用各工具软件的 x86 版本,因为 x64 位版本的 Python 小G在配置时报错了)。

2) 新建一个目录用于存放 Mercurial 站点,小G的目录是:E:\SkyDrive\Development\Mercurial\hgweb

3) 在 IIS 中新建一个网站,名称自定义,小G的网站名是 hgweb,物理路径指向上一步的 E:\SkyDrive\Development\Mercurial\hgweb

4) 在 IIS 中选择刚才新建的网站,右侧的功能视图中选择 “处理程序映射”,如下图:

双击“处理程序映射”,在右侧的动作列表中选择“编辑脚本映射”,按下图配置:

其中“请求路径”指定要处理的文件类型,“可执行文件”指示处理 cgi 文件的应用及其参数。

cgi 是个“古老”但很NB的东东,IIS 5.1 下的配置,请参见《基于windows IIS的C语言CGI WEB服务器环境搭建》。

5) 创建 hgweb.cgi 默认文档

选择刚才新建的 hgweb 站点,在右侧的功能视图中选择默认文档,双击打开:

在右侧的动作列表中选择“添加”,新增一个 hgweb.cgi 的文档项,并将此文档上移置顶:

6) 创建 hgweb.cgi 文件

在 Mercurial 的站点目录(E:\SkyDrive\Development\Mercurial\hgweb)下,新建一个 hgweb.cgi 文件(文件名可自定义),填入以下内容:

#!C:/Python27/python.exe
#
# An example FastCGI script for use with flup, edit as necessary
# Path to repo or hgweb config to serve (see 'hg help hgweb')
config = "E:/SkyDrive/Development/Mercurial/hgweb/hgweb.config"

# Uncomment and adjust if Mercurial is not installed system-wide
# (consult "installed modules" path from 'hg debuginstall'):
import sys; sys.path.insert(0, "C:\\Program Files (x86)\\Mercurial")

# Uncomment to send python tracebacks to the browser if an error occurs:
import cgitb; cgitb.enable() from mercurial import demandimport; demandimport.enable()
from mercurial.hgweb import hgweb, wsgicgi
application = hgweb(config)
wsgicgi.launch(application)

说明:注意第一行,一定要用#!,否则会被当成注释,后面是 Python 2.7 的安装路径;上面第二个灰色区域是 Mercurial 的安装路径,大家请根据自己的具体情况做调整。

7) 创建 hgweb.config 文件

在 Mercurial 的站点目录(E:\SkyDrive\Development\Mercurial\hgweb)下新建一个 hgweb.config 文件,填入以下内容:

[paths]
/Repositories/ = E:/SkyDrive/Development/Mercurial/Repositories/*
[web]
descend = True
baseurl = /

其中阴影部分等号左侧类似于一个版本库分组,右侧是版本库的物理路径;

这时你其实已经可以使用匿名用户访问版本库,输入网址应该可以看到如下界面:

小G在这里绑定了子域名,大家如果没有域名绑定时可直接输入IP地址进行测试;

8) 启用 Url Rewrite

包含 hgweb.cgi 的请求路径是不是有点复杂?下面小G告诉大家如何去除这个复杂的东东。

在新建 HgWeb 站点时,IIS 会自动创建一个 Web.config 配置文件,用编辑器(小G比较喜欢用 Notepad++)打开这个配置文件,并在 System.webServer 的 handlers 结点下添加一个 rewrite 配置节,最终的文件内容如下:

<?xml version="1.0" encoding="UTF-8"?>
<configuration>
    <system.webServer>
        <defaultDocument>
            <files>
                <add value="hgweb.cgi" />
            </files>
        </defaultDocument>
        <handlers accessPolicy="Read, Script">
            <remove name="CGI-exe" />
            <add name="CGIHandler" path="*.cgi" verb="*" modules="CgiModule" scriptProcessor="c:\Python27\python.exe -u &quot;%s&quot; &quot;%s&quot;" resourceType="Unspecified" requireAccess="Script" />
            <add name="CGI-exe" path="*.exe" verb="*" modules="CgiModule" scriptProcessor="C:\Python27\python.exe" resourceType="File" requireAccess="Execute" allowPathInfo="true" />
        </handlers>
        <rewrite>
            <rules>
                <clear />
            <rule name="hgweb.cgi" enabled="true" patternSyntax="Wildcard">
                <match url="*" />
                <conditions logicalGrouping="MatchAll" trackAllCaptures="false">
                    <add input="{REQUEST_FILENAME}" matchType="IsFile" negate="true" />
                </conditions>
                <action type="Rewrite" url="hgweb.cgi/{R:1}" />
            </rule>
            </rules>
        </rewrite>
    </system.webServer>
    <appSettings>
        
    </appSettings>
</configuration>

现在你就可以像下图这样,直接使用域名或IP访问版本库列表了:

9) 测试匿名用户

此时我们只能克隆(clone)版本库,推送版本库时会得错误提示:ssl required,因为我们还没有启用 SSL功能。但可以通过配置暂时禁用 SSL 检查。打开 hgweb.config,在 web 节点下新增 push_ssl=false 配置节,具体内容如下:

[web]

baseurl = /hg

push_ssl = false

这时再尝试推送(push),Mercurial 会返回另一个错误提示:abort: authorization failed。 因为现在连接的是匿名用户, 而默认情况下是禁止匿名用户推送的, 所以再在 hgweb.config 的 web 节下增加一个配置节: allow_push = *, 如下所示:

[web]

allow_push = *

baseurl = /hg

push_ssl = false

现在重新推送,就成功了。

10) 启用 SSL 推送功能

如果不考虑安全性和权限管理,现在我们的 HgWeb 站点其实已经可以正常使用了。但在实际应用中,我们不可能忽略安全性问题,所以我们接下来配置安全和权限相关的设置。

打开 IIS,点击最顶级的服务器结点,在右侧的功能视图中选择“服务器证书”:

在右侧的动作列表中选择“创建自签名证书”,确定即可生成证书,如下图:

在 hgweb 站点上右键,选择编辑绑定:

点击“添加”,新增一个 https 的网站绑定,端口设置为443,SSL证书选择刚才创建的自签名证书,并删除原来的 HTTP 绑定信息,具体如下图:

编辑 hgweb.config 文件,删除 push_ssl = false 配置节,表示推送动作必须启用 SSL。

先到客户端尝试执行一下 clone 命令, 会发现 Mercurial 返回了一个错误提示,原来 Mercurial 对我们刚才创建的自签名证书是非常不信任的,,它并不承认这个证书,但是有一个 –insecure 选项可以用来解决这个问题, 在控制台中执行以下命令:

注意:这里的克隆使用的 URL 地址是区分大小写的,书写错误会导致 404 错误提示,小G怀疑这是 hgweb 的 cgi 应用的一个 bug。

Clone 指令能够成功执行, 但是会返回一个警告,这个警告很重要,里面包含一个 fingerprint 的信息, 把上述警告中的 fingerprint 复制下来,(即上图中的标记部分),找到当前用户的根目录,(C:\Users\Tim), 里面应该有一个 mercurial.ini,用任意文本编辑器打开此ini文件, 参考如下内容修改:

# Generated by TortoiseHg settings dialog
[tortoisehg]
ui.language = zh_CN
vdiff = beyondcompare3
ciexclude = *.o,*.lo,*.la,*.al,.libs,*.so,*.so.[0-9]*,*.a,*.pyc,*.pyo,*.rej,*~,#*#,.#*,.*.swp,.DS_Store,_UpgradeReport_Files,bin,debug,release,obj,*.suo,UpgradeLog.XML,*.user,*.scc,*.vspscc,*.pdb,UpgradeLog*.XML,_ReSharper.*,Thumbs.db,logs,*.Publish.xml,*.postbuild,*.vssscc,*.vspscc
[ui]
merge = beyondcompare3
username = gb2013
[web]
push_ssl = True
[hostfingerprints]
code.domain_name.com = 7f:65:a7:ab:5d:d0:e9:05:80:1e:f4:cb:71:8c:59:42:4d:d2:3d:3c

其中阴影部分就是我们要新增的内容,左侧是 hgweb 绑定的域名,如果没有域名可直接填写服务器IP,右侧是刚才使用 clone 指令时得到的 fingerprint 。

注意: 修改mercurial.ini是在客户端执行的,也就是说,每一台客户端都需要执行本步骤以避免安全警告。

11) 设置身份认证方式

打开 IIS,选择 hgweb 站点,在功能视图中选择“身份认证”:

禁用除“基本身份认证”以外的其他认证方式:

如果使用了本机帐户, 需要注意的是,一般为本机添加的新用户都是属于 User 组的, 而 User 组默认对许多文件夹只有读权限,而没有写权限,这时在服务端要在 Repo 的根目录上给 User 组写权限,否则会抛出如下错误:

HTTP Error: 500 (D:\Mercurial\Repos\EERP.Web\.hg/store\00changelog.i:)

[command returned code 255 Fri Mar 02 15:56:42 2012]

12) 自动验证

通过上述操作,已经可以使用 hgweb 来管理我们的代码了。但是每一次连接服务器都要输入一次用户名和密码,其实 Mercurial 也支持自动验证。打开用户根目录下的 Mercurial.ini,增加 [auth] 配置节:

[auth]

default.prefix = https://code.domain_name.com/

default.username = gb2013

default.password = ********

其中,default 并没有实质意义,仅仅为了分组,可以将default改为任何名字。

3. 使用 SkyDrive 云端服务来同步自己的版本库

这一步操作可有可无,但小G推荐大家还是这样做一下。

我们确实无法预料服务器会在什么时间由于硬件故障而导致宕机,当然最可怕的还是硬盘损坏,那时我们辛辛苦苦所得的劳动成果都将化为乌有,这对于我们开发人员来说是个不小的打击。因此,小G推荐大家把自己的版本库同步到云端。

我比较喜欢微软的 SkyDrive 云端存储服务,在此也推荐大家使用它。同样的服务还有 Dropbox、百度云盘、金山快盘和360云盘等,小G原本最喜欢的是 Dropbox,但是由于天朝威武的 GFW,我们无法使用它的 Web 端,最后只得忍痛割爱放弃它,至于国内的各个网盘,小G对于它们的稳定性有些怀疑,所以暂且不予考虑。

SkyDrive 经过前面几代的更新,现在功能已经比较成熟,尤其是它的 Web 端,做得非常完美,灵活的右键菜单、拖拽上传及文件分享的权限管理等,带给我们 RIA 一样的操作体验,并且上传和下载速度也不慢。下面 SkyDrive 的空间升级方案,小G觉得价位也很合理:

好了,不给微软打广告了,小G只是觉得这个服务非常方便(^_^),小G会在以后的文章详细介绍它的使用方法。

下面说一下同步所需要的操作:

在安装 SkyDrive 客户端之后,不要直接将版本库目录设置为同步目录,因为 SkyDrive 是即时监控同步目录中文件变化并同步的,这样大家远程推送代码时会造成版本库损坏(小G和伙伴亲测得出的结果)。这一问题也很好解决,使用第三方同步软件(小G用的是 Allway Sync)来将版本库目录同步至 SkyDrive 的本地目录中,为避免版本库损坏,小G将设置修改为单向同步(Mercurial->SkyDrive)且在文件变动后10分钟才进行同步操作。

至此,我们自己的 Mercurial Web Server 就搭建完毕。hgweb 并没有提供 Web 端创建版本库以及用户管理的功能,所以,乡亲们如果有兴趣,我们可以在 github 中组织一个开源项目。

转载于:https://www.cnblogs.com/gb2013/archive/2013/02/01/Mercurial_WebServer.html

Mercurial 版本控制服务器(Web Server)的搭建相关推荐

  1. 空服务器安装linux,debian服务器linux服务器web建站搭建linux服务器之Debian安装

    debian服务器linux服务器web建站搭建linux服务器之Debian安装 原文来自i火吧 大家都知道linux的发行版本很多,有centos啊,debian啊,ubuntu等,下面我就用de ...

  2. Nginx负载均衡:分布式/热备Web Server的搭建

    Nginx是一款轻量级的Web server/反向代理server及电子邮件(IMAP/POP3)代理server.并在一个BSD-like 协议下发行.由俄罗斯的程序设计师Igor Sysoev所开 ...

  3. 勤哲excel服务器WEB网页环境搭建问题解决

    因为客户希望在浏览器上使用勤哲的功能,因此希望大家勤哲excel服务器的web环境. 他们用的是勤哲2010版,需要装到64位环境下.在搭建的时候,遇到2个主要问题. 问题1:编译器错误消息: BC3 ...

  4. goahead Web Server 环境搭建

    GoAhead WebServer GoAhead WebServer,它是一个源码,免费.功能强大.可以在多个平台运行的嵌入式WebServer. GoAhead WebServer的主要特性有: ...

  5. 企业级邮件服务器Exchange server 的搭建(一)

    录制没弄好,声音有点小,带上耳机,调到最大 Exchange server 2007 简介 企业中在windowsserver 2008上构建邮件服务器是不行的.因为没有pop3等的支持. 所以要用到 ...

  6. 利用阿里云服务器windows server 2012 搭建vpn

    首先可以查阅这篇文章,感谢作者大大: http://abool.blog.51cto.com/8355508/1575399 以下是成功的关键 1,需要在服务器管理器中安装三个服务,网络策略和访问,w ...

  7. svn服务器web项目,liunx 搭建svn服务器并实现钩子自动更新到web项目

    1:检查系统有没有安装svn #rpm -qa subversion 2: 如果没有安装采取安装svn # yum install subversion 3: 创建版本库 # mkdir /opt/s ...

  8. 使用FileZilla Server轻松搭建个人FTP服务器

    Linux平台下快速搭建FTP服务器 服务器FTP Server环境搭建 针对以上遇到的问题的解决方案如下: 1)如何上传文件到云服务器上          关于这个问题,我首先想到的是使用FileZ ...

  9. 操作系统学习3--Windows server 2012搭建web服务器

    Windows server 2012搭建web服务器 经过前面的铺垫,我们对win server一些基础特性都有了简单的了解,win server可以作为dhcp和dns服务器,也能做一个web服务 ...

最新文章

  1. 【转载】关于RabbitMQ的消息确认
  2. 爬虫基础-登陆github获取个人信息
  3. 三菱fx5u编程手册_实用分享 | 三菱FX 5U特点是什么?
  4. spring配置c3p0连接池、spring的声明式事务管理
  5. vuex 基本入门和使用(一)
  6. IIS 启动不了(服务没有及时响应启动或控制请求)解决
  7. 读懂Java代码总结
  8. react接收后端文件_React如何从后端获取数据并渲染到前端?
  9. kylin启动netstat: n: unknown or uninstrumented protocol
  10. linux 单用户模式 挂载u盘_Linux服务器如何识别移动硬盘?
  11. java linux和windows下文件路径间隔符的写法——解决linux下程序在windows下运行时的上传文件出错问题...
  12. etcdctl的使用
  13. 图片和视频的相互转换
  14. 银行计算机岗社会招聘考什么题目,必知丨应聘银行技术岗,考试都考啥?
  15. 2019东北四省 H. Skyscraper (树状数组)
  16. 产品经理学习笔记(13)-用户反馈的意义
  17. 微服务 杜家豪_将“厕所革命”进行到底
  18. 新时代动画电影的互联网宣传
  19. 科技公司逐鹿手机配件赛道,“降维打击”会出现吗?
  20. 树以及二叉树的常用性质以及遍历

热门文章

  1. cadence安装完怎么打开_Linux 环境下Vivado与Cadence仿真工具联合仿真环境的搭建
  2. eclipse svn插件安装_Visual SVN和Tortoise SVN的安装简单使用汉化
  3. 如何用RHEL System Role把Postfix安装和配置自动化?
  4. 如虎添翼|高德地图+Serverless 护航你的假日出行
  5. 如何用 Nacos 构建服务网格生态
  6. OpenYurt 入门 - 在树莓派上玩转 OpenYurt
  7. 从零开始入门 K8s | Kubernetes API 编程范式
  8. android tcp socket框架_最流行的 Web 框架 Gin 源码阅读
  9. mysql 查询if语句执行顺序_MySQL 语句的执行顺序
  10. c语言如何给阻塞函数加超时,在代码中写一个延时而不阻塞的函数方法,给大家的参考 - 单片机 - 电子工程世界-论坛 - 手机版...