`
cloudtech
  • 浏览: 4606217 次
  • 性别: Icon_minigender_1
  • 来自: 武汉
文章分类
社区版块
存档分类
最新评论

Mercurial - 分布式版本控制系统

 
阅读更多

Mercurial 简介

Mercurial 是一种轻量级分布式版本控制系统,采用 Python 语言实现,易于学习和使用,扩展性强。其是基于 GNU General Public License (GPL) 授权的开源项目。相对于传统的版本控制,具有如下优点:

  • 更轻松的管理。传统的版本控制系统使用集中式的 repository,一些和 repository相关的管理就只能由管理员一个人进行。由于采用了分布式的模型,Mercurial 中就没有这样的困扰,每个用户管理自己的 repository,管理员只需协调同步这些repository。
  • 更健壮的系统。分布式系统比集中式的单服务器系统更健壮,单服务器系统一旦服务器出现问题整个系统就不能运行了,分布式系统通常不会因为一两个节点而受到影响。
  • 对网络的依赖性更低。由于同步可以放在任意时刻进行,Mercurial 甚至可以离线进行管理,只需在有网络连接时同步。

从 repository 开始

版本控制系统中的 repository 就像一个仓库一样,用来存储被管理的数据文件,包含数据文件的不同版本。传统的版本控制系统中,这样的repository 是集中式的。除了这样一个集中式的 repository 之外,每个用户会有一份自己的工作版本拷贝。用户通过命令同步自己的拷贝和集中式的repository。

分布式版本控制系统中的 repository 则采用的是对等网络式的方式。传统集中式的管理中,只有一份 repository,其他的只是工作拷贝,不包含额外的版本。分布式的管理当中,每个用户所持有的都是一个真实的 repository,当中存储有不同的版本信息和维护一个 repository 的必要的辅助元数据。这样一个对等工作模式当中,用户通过交换下文即将提到的 changeset 来完成同步。

这样做的一些优点在于,工作的并行度将大大的提高。每个用户都可以带着这样的repository,从这里他可以把当前的工作拷贝切换到 repository 里面存储的任何一个版本。这个版本可以是之前正在工作的版本,现在需要合并进一些别人的意见,也可以是用户私有的一个版本,当前正在做很多前瞻性的工作,还没有能同步给其他用户使用。也同样是因为这样的模式,每个用户可以任意把自己的 repository 当中的一个版本交换给其他用户,而不需要对自己手头正在工作的版本进行回退。下图是这样一个灵活的工作模式的演示。


图 1. 工作模式的演示
工作模式的演示

Mercurial 里的元素

Revision

在使用Mercurial的系统中每个改动隔离在各自的 repository 里,既避免把不相关的代码混杂起来, 又便于一个接一个的测试每一部分工作,用户做的每个改动称为一个 revision。一般会有一个所有用户都可以访问得到的 repository 保存了项目的“主要”版本,工作repository 是用户自己做事情的地方,实现新的特性,修改漏洞,重构,实验等,当完成改变后,你可以 push 到共用的 repositor y中,即完成了一个 revision。

Changeset

一个或多个文件的改变集合在一起形成一个逻辑单元,称为 changeset。每一个 changeset由两部分内容描述,版本号和 changeset 标识,例如:

changeset: 207:58e4906e69e3

冒号前面的数字代表版本号,它用来标识本地 changeset。这个版本号只有在用户的本地repository 中才有意义。冒号后面的那个很长的十六进制串是 changeset标识, 它是确定changeset的全局唯一标识符, 在所有包含这个 changese 的 repository 中都相同。多个用户之间讨论changeset,一般使用这个 changeset 标识,而不是上面说的版本号,因为完全有可能每个用户的 repository 中同样的 changeset 版本号不同。

Head

Head 表示 repository 中每个分支最新的 revision,通常在合并几个分支时会用到这个概念。

Tip

Tip 是最新的一个 changeset 的版本号的一个别名。在命令中任何使用版本号的地方都可以使用 tip 来代替最新的 changeset的版本号。Tip在各个repository中是不同的,同时一个repository 中只有一个 tip。

Log

Log 命令按时间顺序从近到远的记录着在 repository 中发生的每一次事件。可以通过指定-v诊断输出选项来获得更多更详细的历史信息,或者指定—debug选项来获得历史信息中的一切细节。

动手操作起来

以下是一些实际使用 Mercurial 中常用的例子。Mercurial 的原意是元素周期表当中的汞元素,但是 Mercurial 这样的单词显然不太适合日常使用。事实上 Mercurial 的命令取了元素周期表当中汞元素的化学符号:hg,所有的 Mercurial 命令都以 hg 开始。

$ hg command [options]

其中 command 是 Mercurial 的命令。每个命令的具体的命令行选项可以使用:

$ hg help command

来获得。

克隆一个 repository

我们使用 clone 命令克隆一个 repository,它生成一个完整的 repository 复本,这样我们就有一个本地私有的 repository 来工作。

例如:

$ hg clone http://foo.com/hg/project1

如果所有都没问题,clone 命令输出:

destination directory: project1 requesting all changes adding changesets adding manifests adding file changes added 127 changesets with 448 changes to 143 files 139 files updated, 0 files merged, 0 files removed, 0 files unresolved

此时,我们应该在当前目录下发现一个目录叫 project1,目录下的文件是我们刚克隆的 repository 的精确复本。在 Mercurial 中,每一个 repository 是自包含的。当你克隆一个repository 后,新 repository 变成克隆时它的精确复本,但是后续的两个 repository 当中任一方改变都不会在对方显示,除非用户使用 pull 或 push 命令明确地传递改变,这个将在后面介绍。

另外,每个用户可以使用 init 命令将本地的一个目录初始化为一个 Mercurial 的 repository,只需要在那个目录下运行:

$ hg init

如果设置好了同步共享的发布方式,其他用户就可以来克隆该用户的 repository 了。

发布你的改动

进入工作目录,使用我们喜欢的编辑软件修改,例如我们要修改 main.py 让它增加打印一行输出:

def main(): print "I'm in the a function." print "Great joy of using Mercurial!" #新加的一行 if __name__ == "__main__": sys.exit(main())

完成之后退出编辑器,任务完成。有了刚才的修改我们就可以创建一个changeset。

在创建 changeset 之前如果想确认一下哪些文件被改动了,可以使用 status 命令。

$ hg status M main.py

使用 diff 命令可以检查实际文件内容的改变:

diff -r a58db6f0e482 main.py --- a/main.py Thu Nov 29 13:38:38 2007 +0800 +++ b/main.py Thu Nov 29 13:46:10 2007 +0800 @@ -1,5 +1,6 @@ def main(): def main(): print "I'm in the a function." + print "Great joy of using Mercurial!" #新加的一行 if __name__ == "__main__": sys.exit(main())

diff 命令的默认输出是通用的补丁格式,易于在各种系统之间交换和讨论。

创建一个 changeset 后我们就可以用 commit 命令提交了。

$ hg commit

这个命令把我们带到一个编辑器内,缺省的编辑器是 vi,同时给我们展示了几行如下的文字:

HG: user: Guolian Yun <yunguol@cn.ibm.com> HG: changed main.py

第一行是空的,接下来的几行表明哪些文件将进入本 changeset。为了改变 changeset,我们必须描述它的原因,这通常称为 changeset注释。让我们输入一些:

I’m using Mercurial! HG: user: Guolian Yun <yunguol@cn.ibm.com> HG: changed main.py

接着,保存并退出编辑器,如果一切正常,commit 命令将没有任何提示地输出。

让我们看看status命令现在告诉我们什么?

$ hg status

什么也没有!我们的改动已经提交到changeset里了,那里没有修改的文件需要提交的。Repository 中内容和当前工作目录的内容一致了。

现在可以检查以下最新的改动是不是包含刚才所添加的 changeset 注释,使用 tip 命令就可以显示了:

$ hg tip: changeset: 2:2874393e3d9c tag: tip user: Guolian Yun <yunguol@cn.ibm.com> date: Thu Nov 29 10:10:39 2007 +0800 summary: I'm using Mercurial!

目前新的 changeset 只存在本地 repository 中,如果想和其它 repository 分享改动,我们需要使用 push。

$ hg push project2

project2 为你想要 push 的目标 repository 的名字。

引入他人的改动

想要得到所有在别的 repository中而在本地repository中没有的改动,可以采用 pull命令。

$ hg pull project3

project3为我们想要得到更新的目标repository的名字。

在 Pull 后,缺省情况下Mercurial不更新工作目录。这意味着虽然repository现在有changeset,但在工作目录中的 main.py 文件仍然是 pull 之前老的内容。

如果只想从hg clone的 repository 中更新当前 revision 到最新版,可以直接采用:

$ hg pull -u

Repository 之间的同步

上文当中的 push 和 pull 的操作,是处于不同位置的 repository 之间的同步。之前给出的两个例子是本地目录 repository 之间的同步。Mercurial 还支持以下形式的 repository 之间的同步:

file://local/filesystem/path http://[user@]host[:port]/[path] https://[user@]host[:port]/[path] ssh://[user@]host[:port]/[path]

其中 file 协议和本地目录相同。在 http 和 https 协议上使用push命令,需要在远端的服务器上启用相关的属性。ssh协议是众多系统中支持的shell。

标准的 Mercurial 发行包中还附带一个 Python CGI 脚本 hgweb.cgi, 可以用来参考搭建一个多用户可以集中式的同步改动的界面,如下图所示:


图 2. 界面
界面

扩展 Mercurial

Mercurial 系统中提供一种扩展机制来添加新的命令。通过扩展添加的命令可以在现有的Mercurial 系统的基础上添加新的功能,这些命令跟随hg后被调用时就像原生的命令一样。本文介绍两个常用的Mercurial扩展:Patchbomb和Mq。

Patchbomb

Patchbomb是一个在Mercurial系统中利用发送邮件的方式来交换changeset的扩展。Patchbomb添加了一个新的email命令。通过调用hg email命令,changeset 提交时的信息的第一行将作为邮件的主题,信件的正文包括完整的 changese t提交信息,以 patch 的形式发布出来的 changeset 完整补丁。如果一次发送的是多个changeset,那么Patchbomb会提示输入本次 changeset 集的总提示信息,这部分信息将作为第一封信,信件主题以[PATCH 0 of N]开头,changeset 则会以[PATCH i of N]将的主题开头发出,其中i是 changeset在本地 repository 当中的顺序。多changeset 系列邮件中,每封信会在邮件头中包含合适的回复信息,这样在邮件客户端可以清晰的显示出系列 changeset 之间的层次关系。


图 3. 层次关系
层次关系

Patchbomb 支持使用本地系统中的 sendmail 程序来发送邮件,同时支持使用 SMTP 邮件服务器。用户如果长期固定为某个项目工作,还可以将邮件的收件地址和发信地址提供给Patchbomb,免去每次手动输入的麻烦。这一切都可以在 Mercurial 统一的.hgrc当中设置,以下是一个完整的例子。

[extensions] hgext.patchbomb = [email] method = smtp # 还可以在这里指定/usr/sbin/sendmail from = Zhengang Li <lizg@cn.ibm.com> to = groupmail@foo.com [smtp] host = smtp.foo.com

Patchbomb 作者为Bryan O’Sullivan,该扩展现在随同 Mercurial 系统一起发布,用户不需额外下载安装,只需如上例中一样启用即可。

Mq

Mq 扩展的全名是Mercurial Queues,顾名思义该扩展将用户本地的多个 changeset 排列到队列中。原先分布式版本控制系统中,changeset 一旦提交并不能修改。有了 Mq 扩展之后,用户可以将本地的任意数量的 changeset 存放至一个本地的队列当中,对这些 changeset 用户除了可以使用传统的 changeset 上的任何命令之外,还可以修改changeset,包括提交信息和版本补丁的改动。

启用 Mq 扩展的办法同其他扩展一样,在.hgrc当中添加如下信息:

[extensions] hgext.mq=

Mq的命令是一系列以字母q打头的命令,qinit,qnew,qrefresh,qdiff,qpop和qpush等。Qinit用来初始化用来存放补丁队列的目录,qnew创建一个新的补丁changeset,qrefresh将改动刷新到当前的补丁当中去,qdiff将当前的补丁打印到屏幕,qpop和qpush用来移动当前存放在队列顶部的补丁。完整的 q 系列命令可以从hg help给出的列表中获得。

Mq中所有的 changeset 补丁存放在项目顶层目录的.hg/patches下面,用户可以手动修改这些补丁当中的提交信息。Changeset 补丁的顺序存放在.hg/patches/series文件当中,同样的,用户可以修改这些补丁的顺序。

Mq的作者是Chris Mason,该扩展现在随同 Mercurial 系统一起发布,用户不需额外下载安装。

如果现有的扩展不能满足用户的要求,编写自己的扩展也不困难。Mercurial 使用 Python编写,编写一个新的扩展相当于在 Mercurial 系统的 hgext 包当中编写一个新的模块。具体的扩展实现还有些约定的规则,用户可以参考 Mercurial 所提供的文档。

分享到:
评论

相关推荐

    Mercurial(分布式版本控制系统) v5.0.2.zip

    Mercurial是一款专业好用的轻量级分布式版本控制系统。软件采用Python 语言,基于 GNU General Public License (GPL) ,更加方便你的管理和使用,有更优秀的系统,而且对网络的依赖程度也降低了非常多。如果您对目前...

    Mercurial 分布式版本控制系统 部署 server 服务

    Mercurial 分布式版本控制系统 部署 server 服务

    分布式版本控制系统_Mercurial

    分布式版本控制系统_Mercurial

    Mercurial-4.4.2

    Mercurial 是一种轻量级分布式版本控制系统,采用 Python 语言实现,易于学习和使用,扩展性强。其是基于 GNU General Public License (GPL) 授权的开源项目。

    Mercurial-3.6.3-x64

    Mercurial 是一个快速的小型轻量级源代码控制管理系统,旨在高效地处理大型分布式项目,SourceTree辅助工具,GIT辅助工具.

    MercurialforPython(分布式版本控制系统)V3.6.3官方版x64

    Mercurial For Linux是一个轻量级分布式版本控制系统,采用 Python 语言实现,易于学习和使用,扩展性强。其是基于 GNU General Public License (GPL) 授权的开源项目。相对于传统的版本控制,分步式的版本控制器和...

    MercurialforPython(分布式版本控制系统)V3.6.3官方版x86

    Mercurial For Linux是一个轻量级分布式版本控制系统,采用 Python 语言实现,易于学习和使用,扩展性强。其是基于 GNU General Public License (GPL) 授权的开源项目。相对于传统的版本控制,分步式的版本控制器和...

    使用Mercurial进行分布式修订控制Distributed revision control with Mercurial

    Mercurial的开发人员指南,这是一个易于使用且可扩展的版本控制系统。

    Mercurial-2.4.exe

    Mercurial 是一种轻量级分布式版本控制系统,采用 Python 语言实现,易于学习和使用,扩展性强。其是基于 GNU General Public License (GPL) 授权的开源项目。

    在Windows使用apache搭建Mercurial版本控制服务

    在Windows使用apache搭建Mercurial版本控制服务。 Mercurial是分布式的版本管理系统,这个文档将教你怎样搭建Mercurial服务器,并试用apache的用户管理来配置Mercurial服务器的用户和权限。

    tortoisehg-2.8.1-hg-2.6.2-x86

    Mercurial 是一种轻量级分布式版本控制系统,采用 Python 语言实现,易于学习和使用,扩展性强。其是基于 GNU General Public License (GPL) 授权的开源项目。 TortoiseHg 是一个跨平台的 Mercurial 分布式版本控制...

    Mercurial 2.1.1 Windows版

    Mercurial 2.1.1 Inno Setup installer - x86 Windows Mercurial 是一种轻量级分布式版本控制系统,采用Python 语言实现,易于学习和使用,扩展性强。安装程序不需要管理员权限。

    TortoiseHg-4.5.3

    TortoiseHg 4.9,64位。Mercurial分布式版本控制系统的可视化客户端工具,集成了一系列图形化工具和Shell扩展的工具

    tortoisehg-2.7.1

    Mercurial 是一种轻量级分布式版本控制系统,采用 Python 语言实现,易于学习和使用,扩展性强。其是基于 GNU General Public License (GPL) 授权的开源项目。 TortoiseHg 是一个跨平台的 Mercurial 分布式版本控制...

    [msi文件] tortoisehg-2.7.2 32位

    Mercurial 是一种轻量级分布式版本控制系统,采用 Python 语言实现,易于学习和使用,扩展性强。其是基于 GNU General Public License (GPL) 授权的开源项目。 TortoiseHg 是一个跨平台的 Mercurial 分布式版本控制...

    Mercurial 2.1.1 source release

    Mercurial 2.1.1 source release Mercurial 是一种轻量级分布式版本控制系统,采用Python 语言实现,易于学习和使用,扩展性强。此为2.1.1版源码包。

    mercurial 3.3.2 源码

    Mercurial是一个跨平台的分布式版本控制软件,主要由Python语言实现,但也包含一个用C语言实现的二进制比较工具。Mercurial一开始的主要运行平台是Linux,现在Mercurial已经被移植到Windows、Mac OS X和大多数的类...

    tortoisehg-5.5.1-x64.msi

    mercurial 版本控制,最新版。适用于64位系统,简单好用。Mercurial分布式版本控制系统的可视化客户端工具,集成了一系列图形化工具和Shell扩展的工具

    tortoisehg-2.8.2-hg-2.6.3-x86

    TortoiseHg 是一个跨平台的 Mercurial 分布式版本控制系统的可视化客户端工具。此文件为目前官网最新版本。

    tortoisehg-2.4.2-hg-2.2.3-x86

    tortoisehg是目前最流行的Mercurial轻量级分布式版本控制系统的客户端程序,类似于SVN的tortoiseSVN客户端

Global site tag (gtag.js) - Google Analytics