Mercurial 是典型的分布式版本控制系统,每个工作副本都包含完整的历史记录,即使服务器暂时不可用,开发人员也能正常提交、分支和回滚。Windows Server 作为团队内部的代码托管节点时,Mercurial 的部署重点在于让 hg 命令稳定运行、仓库目录清晰可维护,以及通过 HTTP 或共享路径把仓库安全地发布给客户端。

一、安装 Mercurial 与环境准备
最省事的安装方式是下载 Mercurial 官方提供的 MSI 安装包,安装程序会自动把主程序放到 C:\Program Files\Mercurial 目录,并尝试添加到系统 PATH。没有图形界面的服务器可以选择 Chocolatey 包管理器,单条命令即可完成部署。如果团队已经维护了 Python 环境,也可以用 python -m pip install mercurial 安装,但需要注意版本匹配和脚本目录 C:\Python39\Scripts 是否包含在 PATH 中。
安装完成后,打开新的 PowerShell 或 CMD 窗口,执行 hg --version 验证。如果提示 hg 不是内部或外部命令,说明环境变量没有生效或者安装目录没有被加入 PATH。此时可以手动执行下面的 PowerShell 命令,把 Mercurial 目录追加到系统环境变量中。
[Environment]::SetEnvironmentVariable("Path", $env:Path + ";C:\Program Files\Mercurial", "Machine")
[Environment]::SetEnvironmentVariable("Path", $env:Path + ";C:\Program Files\Mercurial", "User")
全局配置通常保存在用户目录下的 mercurial.ini 文件中,例如 C:\Users\Administrator\mercurial.ini。修改配置前可以先执行 hg showconfig --debug,查看实际加载的配置文件路径。最基本的配置是提交用户名,格式建议采用姓名加邮箱,其中邮箱地址可以写成 admin@bbccb.com 这样的形式。
[ui] username = Server Admin <admin@bbccb.com>
如果需要批量部署到多台服务器,可以把统一的 mercurial.ini 放到登录脚本中分发。对于 C:\Program Files 目录有写入限制的企业环境,用户级配置更加灵活,每个账号对应不同路径,例如 C:\Users\deploy\mercurial.ini。配置文件中还可以设置默认编辑器、合并工具和日志编码,这些都能减少日常操作中的兼容问题。
二、创建仓库并通过 hg serve 发布
仓库目录建议集中在 C:\Repos 下,按项目名称组织子目录。初始化仓库使用 hg init C:\Repos\project,Mercurial 会在 C:\Repos\project\.hg 目录中保存全部版本历史。初始化后可以先添加一个 README 文件并完成首次提交,验证仓库可以正常写入。
mkdir C:\Repos cd C:\Repos hg init project cd project echo "# 项目说明" > README.md hg add README.md hg commit -m "初始化仓库"
如果只托管一个仓库,可以在仓库目录直接运行 hg serve。但生产环境通常同时管理多个项目,这时应使用 hgweb.config 集中发布。创建 C:\Repos\hgweb.config 文件,在 [paths] 段中把 URL 路径映射到仓库的绝对路径,左侧是访问路径,右侧是磁盘位置。
[paths] project = C:\Repos\project docs = C:\Repos\docs backend = C:\Repos\backend-api
启动服务时指定 --web-conf 参数即可一次性发布多个仓库。hg serve 支持 --port 指定端口,--accesslog 和 --errorlog 记录访问和错误日志。直接运行会占用前台终端,服务器注销或重启后服务就会中断。更好的做法是使用 NSSM 这类工具把 hg serve 注册为 Windows 服务,设置自动启动后由系统统一管理。
nssm install MercurialServer "C:\Program Files\Mercurial\hg.exe" serve --web-conf C:\Repos\hgweb.config --port 8000 nssm set MercurialServer AppDirectory C:\Repos nssm set MercurialServer AppStdout C:\Repos\hg-stdout.log nssm set MercurialServer AppStderr C:\Repos\hg-stderr.log nssm start MercurialServer
除了 HTTP 方式,还可以通过 Windows 文件共享让客户端直接访问 \\mercurial-server\Repos\project 这样的 UNC 路径。这种方式配置简单,但在多人同时提交时容易出现文件锁和权限问题。如果仓库只在内网使用,HTTP 服务配合防火墙规则通常已经足够;若要开放外网,则必须在前面加反向代理并启用 HTTPS,避免代码内容明文传输。
三、客户端协作与权限控制
Windows 客户端推荐安装 TortoiseHg,它提供了图形化右键菜单,克隆、提交、合并都可以在资源管理器中完成。用 TortoiseHg 克隆时,URL 填写 http://mercurial-server:8000/project,目标路径选择 C:\Work\project。命令行用户可以直接执行 hg clone 获得完整副本。
hg clone http://mercurial-server:8000/project C:\Work\project cd C:\Work\project hg log -l 5
日常协作的基本流程是:先执行 hg pull 拉取远端新提交,再执行 hg update 更新工作目录;修改文件后 hg commit 提交到本地仓库,最后 hg push 把本地提交推送到服务器。如果推送时提示远端有新的变更,需要先 pull 再执行 hg merge,解决冲突后重新提交并推送。Mercurial 的分支模型很轻,分支名可以直接在 commit 时通过 -b 参数指定。
Mercurial 自带的 hg serve 不提供基于用户名的认证体系,它主要通过 IP 地址限制推送权限。在 hgweb.config 中添加 [web] 段,用 allow_push 和 deny_push 控制哪些网段可以写入,allow_read 控制读取范围。例如只允许 192.168.1 网段推送,其他来源只读。
[web] allow_push = 192.168.1.* deny_push = * allow_read = *
这种基于 IP 的控制比较适合内网固定网段环境。如果需要按账号区分读写权限,应当把 Mercurial 放到 Apache 或 IIS 后面,由 Web 服务器处理 Basic 认证或 Windows 集成认证。Windows Server 上还可以利用 NTFS 权限做底层隔离:将仓库目录的完全控制权只授予管理员组,运行 hg serve 的服务账户只给读取权限,客户端推送时由代理层完成身份校验。结合 Active Directory,可以创建类似 hg-repos 的安全组,把所有需要写权限的开发者加入该组,再通过共享或 Web 层映射到 Mercurial 仓库,这样能形成比较清晰的权限模型。
四、备份策略与常见故障排查
版本控制服务器必须配套可靠的备份机制。推荐使用 robocopy 做镜像同步,它适合在 Windows 上保留 NTFS 权限和目录时间戳,而且支持重试。把下面的命令放到任务计划程序中,每天凌晨自动执行一次,就能把 C:\Repos 完整复制到 D:\Backup\Repos。
robocopy C:\Repos D:\Backup\Repos /MIR /COPY:DAT /DCOPY:T /R:2 /W:5 /LOG:C:\Repos\backup.log
hg 命令无法识别是最常见的问题。重新打开终端通常能解决,如果仍然无效,需要检查系统变量 Path 中是否包含 C:\Program Files\Mercurial。使用 Chocolatey 安装时偶尔会出现只写入用户变量而没有写入系统变量的情况,这时可以用 setx 或 PowerShell 手动补齐。
setx /M Path "%Path%;C:\Program Files\Mercurial"
中文文件名乱码和换行符混用也很常见。Mercurial 在 Windows 上建议启用 win32text 扩展,它会在提交时统一换行符为 LF,在检出时还原为 Windows 风格的 CRLF,从而避免不同编辑器之间互相干扰。
[extensions] win32text = [encode] **.txt = dumbencode: [decode] **.txt = dumbdecode:
如果仓库出现锁残留,往往表现为无法提交或推送,并提示 waiting for lock。可以先确认没有正在运行的 hg 进程,然后手动删除 C:\Repos\project\.hg\store\lock 或 C:\Repos\project\.hg\wlock。删除前一定要检查进程列表,避免误删导致仓库损坏。长路径问题在 Windows Server 上也需要关注,Mercurial 可能在深目录层级下无法正常操作。可以通过注册表启用长路径支持,路径为 HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\FileSystem,将 LongPathsEnabled 值设置为 1 后重启生效。
reg add "HKLM\SYSTEM\CurrentControlSet\Control\FileSystem" /v LongPathsEnabled /t REG_DWORD /d 1 /f
最后,建议每个月运行一次 hg verify 检查仓库完整性,并在每次备份完成后对备份副本执行同样的校验。这样在遇到磁盘故障或意外损坏时,能够第一时间发现并切换到可用副本,减少团队停工时间。
MercurialWindows Server版本控制修改时间:2026-09-17 22:38:31