技术开发 频道

分布式版本控制

    本篇介绍Mercurial。

    因为这是我现在用得最多的SCM——最近一个月来几个程序都在用它——所以会说得详细一些。

    我是从云风的BLOG里看到关于Mercurial的介绍,他在文章中介绍了常用的几种DRCS,他个人推荐的是Darcs,但我却看中了Mercurial。

    Mercurial 的优点在于功能强大并且速度超快(相对Bazaar而言,与SVN相比似乎也快一些),看源码Mercurial也是用Python写的,只不过发布版像 是用PY2EXE等工具编译成的EXE,不知道为什么速度会这么快。缺点是操作远程Repository的功能需要一些服务端的安装配置工作,这点不如 Bazaar方便。

    关于Mercurial的使用推荐参考这里的两页文档,很实用。Mercurial的操作命令虽然跟Bazaar差不多,但是设计思路比Bazaar更加“分布”一些,与传统SCM差别较大,可能需要一段时间适应。

    安装很简单,在这里下载最新版本的安装程序安装一下就好了。

    不过要在Windows下通过SSH使用远程Repository的话,需要一些额外的安装配置工作。如果你使用的不是Windows或者在Windows上已经安装了带有ssh命令的Cygwin,可以跳过下面这一部分,直接到后面的“Mercurial的使用”部分。

    首先在这里下载一个PuTTY的工具程序:plink.exe。

    然后在Mercurial的安装目录下找到mercurial.ini文件,用编辑器打开,找到[ui]段增加如下两行:

    ssh = D:\tools\plink.exe -ssh -pw password

    username = username<username@sitename.com>

    username项很好理解,就相当于Bazaar里的whoami命令——我不知道为什么Mercurial没有这个命令,而是默认使用loginname@hostname的形式来标记当前用户,大概它觉得这只是标志,没有什么关系,反正它拥有超强的分支/合并功能。

    ssh 项就是与SSH有关的配置项目了。按照参考文档中所说的,Mercurial通过ssh操作远程Repository时可以交互提示输入登录密码,但是我 在Windows下试验失败,可能是plink的问题。所以在第一次从远程Repository上clone到本地repository时需要在这里用- pw选项输入登录密码(不过用完就可以去掉这一项了——因为不同的项目可能使用不同的远程Repository,所以就可能使用不同的用户和密码,那个时 候可以配置到项目的.hgrc里,详见后面的说明)。

    Mercurial的使用:

    完成必要的安装配置工作以后就可以开始使用了。

    Mercurial的命令是hg——就是汞。不过说实话,我看到Mercurial这个词想到的是水星。

    开始一个项目有两种情况:一是还没有任何Repository的全新项目;二是加入一个已经有的项目——通常已经创建了一个公共的远程Repository。

    第一种情况的流程大致是这样:

    1、创建本地Repository。在项目的工作目录下运行:

    hg init

    将会创建一个.hg的目录。

    2、配置项目目录(可选)。主要内容有两项,一个是配置.hgignore,把不需要加入管理的文件排除掉;另一个是配置.hgrc,主要是配置ssh(此项仅针对在Windows下用plink进行SSH连接的情况):

    .hgignore文件放在项目的根目录上,其内容举例如下:

    syntax: glob

    *.py[co]

    *.swp

    *~

    使用方法一看就明了,就不解释了。

    .hgrc文件放在.hg目录中,其内容举例如下:

    [paths]

    default = ssh://username@remotehost//home/username/projname

    default-push = ssh://username@remotehost//home/username/projname

    [ui]

    ssh = D:\tools\plink.exe -ssh -pw password

    其中paths段里的default/default-push分别是对远程下载上传的默认url,这样在作pull/push操作时可以不必每次输入这个URL。如果SSH不是配置在标准的22端口上,可以在remotehost后面加上(:port)指定端口号。

    ui段里的配置与Mercurial.ini是一样的格式和含义。在Windows下使用plink连接SSH需要在这里用-pw选项配置登录密码,以使pull/push操作能够正常工作。

    3、检查项目状态。命令为:

    hg status

    将会列出所有未commit的有效项目文件及其状态——如果在commit以后项目文件未任何修改,此操作将无反馈信息。

    比如在刚初始化完以后进行检查,将会列出所有项目文件(被.hgignore排除的文件将不显示),并在前面有一个?标志,表示这些文件尚未被版本管理。

    在作完第一次add操作以后检查,则?标志将变为A标志,表示是新增的文件。

    如果在commit以后有文件被修改过,则状态检查会列出这些被修改过的文件,并加上M标志。

    如果在commit以后有文件被删除或改名,则状态检查会把这些文件加上!标志——改名后的新文件则会作为未管理的新文件而加上?标志。

    需要从本地Repository里删除!标志文件则需要使用remove命令,详见后面的说明。

    4、将项目文件加入本地Repository。命令很简单:

    hg add

    即可将项目目录中除了在.hgignore中被排除的文件以外的所有文件都加入到本地Repository中(当然不包括.hg目录,但是会包括.hgignore文件本身)。

    5、将变更提交到本地Repository。命令为:

    hg commit -m "关于本次提交的说明文本"

    6、提交到远程Repository。这里只介绍通过SSH提交的方法,通过HTTP的方法请自行参考相关文档。

    首先需要在服务端安装Mercurial,如果是用Linux服务器的话,参考各发行版说明,ubuntu下的安装是很简单的,直接用:

    sudo apt-get install mercurial

    即可。

    然后在服务端的项目目录下创建一个空的Repository(bazaar不需要这样的步骤,它可以用SFTP直接在空目录里远程创建):

    cd /home/username/projname

    hg init

    最后就可以在客户端推送Repository了,在项目目录下运行:

    hg push ssh://username@remotehostname//home/username/projname

    如果配置了.hgrc里的paths段的default-push,则可以直接用:

    hg push

    如果提交失败,请检查.hgrc和/或mercurial.ini里是否正确地配置了plink的pw选项,或者是SSH的端口号是否正确。如果配置无误仍然失败,可以用debug选项看一下详细出错信息:

    hg push --debug

0
相关文章