2008年12月9日星期二

使用Mercurial Queues

昨天在聊持续集成的时候,同事提出一个问题,因为提交很频繁,能不能让持续集成工具忽略掉某些提交,它们只是完成故事若干步骤的一步,让持续集成工具花1个小时来对明知道不需要的版本进行构建太费时间了。

在ThoughtWorks,很多同事都和我一样患有“频繁提交沉迷综合症”,具体症状是每隔30分钟就得运行提交命令, 否则就血压升高,眼眶发干,手心出汗,焦虑...等。 可是偏偏有时候提交不了,要想提交还得修改不知道多少个文件,你有点恐惧了,可还得硬着头皮干。

正如当时在场的同事田乐回答的一样:根本问题不是持续集成工具是否应该支持这样的功能,而是团队选择的版本控制工具(譬如SVN, CVS, P4)对频繁提交没有提供良好的支持。

我们团队使用的是分布式版本管理工具Mercurial,它医好了我的“频繁提交沉迷综合症”,我把药方写在这里以厮患者。

首先编辑.hgrc文件(* mac和linux用户运行vi ~/.hgrc),在[extensions]条目下加入hgext.mq打开mq的扩展。
[extensions]
hgext.mq =


保存退出,运行

hg --help


你可以在Console上看到新增了很多queue相关的命令

qapplied
qclone
qcommit
qdelete
qdiff
qfold



在mq打开后,如果我们完成了部分修改,可以运行

*hg st (查看本地修改,你应该看到所有被修改过的文件)
*hg qnew -m "[message]" -f "[patch name]" (在queue中压入一条changeset)
*hg st (查看本地修改,现在你应该重新得到了干净的本地目录)


这样在开发的时候我们可以通过hg qnew命令将baby step不断提交,保持一个干净的工作目录。

但是这些changeset是没有提交到主repository上的。在完成了所有的所有的工作后,

我们可以运行
*hg qremove -r qbase:qtip
*hg push
这样,团队中的其他开发人员就可以得到你的修改了。

在我们运行hg qnew后,hg其实帮我们创建了一个标准的patch文件,并把它保存到了
工作目录/.hg/patches


如果你想回家继续开发,可以拷贝走这些patch文件,在另外一台机器上,使用hg qimport或者patch(linux,mac)都可以重建你的工作目录。

如果你有兴趣,请参看mercurial mq的文档

1 条评论:

WPC 说...

http://thought-tracker.blogspot.com/2008/07/hg-vs-git-pullmerge-vs-rebase.html

hehe, maybe git is more suitable for what you described