1.  参考文档

2.  客户端安装

2.1  命令行客户端

一般是建议用 MacPort 。

虽然官方已经提供了 Mac 下的安装包,貌似省事,但在以后安装 Mercurial 各种扩展插件的时候,才是痛苦的开始。开始就用 MacPort 装的话,很多插件以及插件的依赖关系,都有现成的包可以用~

2.2  图形客户端

常见的 Mercurial 客户端参见Other tools that work with Mercurial

我喜欢用命令行,所以配合的是hgview。喜欢全图形化界面操作的同学, Mac 下可以用Murky, Win 下可以用TortoiseHg(这玩意儿现在也有 Mac 和 Linux 下的版本,因为本来就是基于 Gtk 完成的,可用度也不错)。

2.3  避免乱码

比较合适的做法是所有操作系统下对文件内容和文件名都统一使用 utf-8 编码。

如果 Windows 下没有使用 utf-8 编码,那么有可能需要安装使用FixUtf8 Extension插件。

如果 Mac OSX 下有乱码问题,可能需要参考Problem with UTF8 filenames on OSX。不过我用 OSX 系统时还没有遇到这个问题。

3.  中心服务器配置(mercurial-server 方案)

Mercurial 支持多种方式/协议配置中心服务器,最简单的办法直接“hg serve”就可以。所有可选的办法见Publishing Mercurial Repositories,或者选择Free hosting of Mercurial repositories中提到的免费Mercurial空间也行(比如 GitHub 的克隆 Bitbucket)。

注意,mercurial-server 并非是 Mercurial 官方的服务器实现,也不是 hg 命令所提供的简单服务器。相反,这是一个独立的利用 ssh 协议的服务器实现,安全性、权限管理都比较完善。对于比较复杂的自建中心服务器需求,建议选用RhodeCode

3.1  Debian 下基本安装

其实官方提供了 Debian 安装包,并且已经进入了 Debian 和 Ubuntu 的发行版,但是 Lenny 下没有,从 Squeeze 开始才有的。

在 Lenny 下,可以手工安装 Squeeze 的 mercurial-server ,也即手工下载 deb 包,用“dpkg -i”来安装。其中唯一需要解决的一个依赖问题就是 python-support 的版本过低。可以从 lenny-backports 手工下载 python-support 的 deb 包安装,于是 mercurial-server 也就可以正常安装完成了。

3.2  服务基本配置

详细文档参考http://dev.lshift.net/paul/mercurial-server/docbook.html

mercurial-server 的用户认证需要用到 ssh 密钥,这种密钥的生成参考文档OpenSSH Public Key Authentication tutorial

最初步的配置过程只是为 mercurial-server 创建第一个用户(一般都会给他 root 权限)就行了,具体的办法就是把这个用户的公钥弄到 mercurial-server 能找到的地方。比如我已经准备好了 ssh 公钥 id_rsa.pub ,那么可以通过服务器上的如下操作创建首个用户:

cp id_rsa.pub /etc/mercurial-server/keys/root/elias
sudo -u hg /usr/share/mercurial-server/refresh-auth

成功以后我们已经可以通过 Url:ssh://hg@HOST_NAME/PROJECT_NAME 来访问 Mercurial 项目空间了。在 hg 客户端看来,我们访问的是 ssh 服务器上名为 hg 用户的文件;而在 mercurial-server 看来,能够完成密钥认证过程的其实是用户 root/elias ,也即与这个公钥文件所对应的用户,这个用户属于 root 组。

3.3  如何在服务器创建新的项目路径

创建新项目要求有 init 级别的权限,默认配置下 root 组的用户拥有 init 权限。在客户端主机如下操作可以在服务器端创建新项目路径:

hg init
hg clone . ssh://hg@HOST_NAME/PROJECT_NAME

其中第一句会将本地当前目录转变为一个 hg 控制下的目录,第二句会把当前本地目录 push 到服务器的指定路径上去,也就相当于在服务器新创建了一个 hg 项目目录。

3.4  如何在服务器端启用 hook

hook 一般放在 .hgrc 文件中。对 mercurial-server 来说,主要是用服务器端代码仓库的 .hg 目录下的 hgrc 文件来进行设置。

比如 mercurial-server 自带的 hgadmin 仓库(用来管理权限配置文件和用户认证证书),在我的服务器上有文件 /var/lib/mercurial-server/repos/hgadmin/.hg/hgrc ,其内容为:

# WARNING: when these hooks run they will entirely destroy and rewrite
# ~/.ssh/authorized_keys

[extensions]
hgext.purge =

[hooks]
changegroup.aaaab_update = hg update -C default > /dev/null
changegroup.aaaac_purge = hg purge --all > /dev/null
changegroup.refreshauth = python:mercurialserver.refreshauth.hook
也即使用钩子来应用新上传上来的权限配置文件和认证证书。

4.  日常使用技巧

4.1  如何处理不小心造成的错误提交

正统方法参考:Chapter 9. Finding and fixing mistakes,利用插件的方法参考MqExtension 提供的 Strip 指令。(应对各种情况的详细操作步骤仍需进一步总结)

5.  特殊用途

5.1  hg 版本库导入 git 或 svn

依各人习惯不同,可能会选用不同的代码版本控制工具,甚至会造成项目的补丁需要在不同版本控制工具之间转来转去。这里介绍把 hg 版本库弄到 git 或 svn 里的办法(保留提交日志)。这里记录的办法不是唯一的,但是是我试验过的(有可能利用 MQ 机制传递补丁是更靠谱的方法)。

可选步骤:hg 库整理

有时在 hg 库弄到 git 里以后,会发生从 git 导得出来导不回去的状况,或者在 git 里可以用,上传不到 svn 等奇怪现象。一般这些都是因为原始 hg 版本库中存在代码分支合并,转换脚本没有完美地在 git 和 svn 中予以支持。

如果出现了以上状况,建议利用 hg 的 Collapse 扩展干掉涉及代码分支的几个版本。

比如 hg 库从版本 12 开始有分支,并最后合并为版本 15 ,那么我们用如下指令把版本 12 到 15 合并成一次提交:

 hg collapse -r 12:15

风险最小的版本库结构是没有分支——完全直线式。。

hg 导入 git

这里利用的是 fast-export 脚本,实际还有其他方法可以实现,参考 Convert a Mercurial Repository to Git

mkdir myrepo; cd myrepo;
git clone git://repo.or.cz/fast-export.git .
rm -rf .git .gitignore
git init
./hg-fast-export.sh -r ../path/to/local/hg/repo
git clean -f # remove fast-export files

git 导入 git-svn

先使用 git svn clone 指令把 svn 抓成 git 库(假设存放在 git_svn 目录),然后把从 hg 导过来的 git 库(假设存放在 git_hg 目录)中的提交记录弄到里头,操作如下,参考文档 How to import existing GIT repository into another?

mkdir patch_dir
cd git_hg
git format-patch --root HEAD --no-stat -o ../patch_dir/
cd ../git_svn
git am ../patch_dir/*

如果在两个库之间存在目录位置变化,可以使用 git format_patch 之类的 --src-prefix 和 --dst-prefix 参数搞定。

利用 git-svn 提交到 svn 版本库

  1. 用 git svn rebase 获取 svn 版本库的更新
  2. 用 git svn dcommit 提交本地修改到 svn 服务器。

详细参考文档 小试git-svn

GlossyBlue theme adapted by David Gilbert
Powered by PmWiki