pizicai105

hellosz@163.com

Mercurial-分布式版本控制系统

  Mercurial 简介

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

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

  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选项来获得历史信息中的一切细节。

 

===============================================

为什么我们要放弃Subversion

http://www.kuqin.com/managetool/20090319/41349.html

Subversion曾经是我们亲密无间的战友,但自从一年前部分团队成员去了美国,我们和Subversion的关系就开始出现了裂痕,首先是将Subversion服务器架设在美国后,中国开发人员频繁进行的一些操作变得非常缓慢,本来通过追溯代码历史便可找出原因的问题,却因为网速缓慢,导致开发者将大量的时间耗费在等待服务器响应,而不是分析问题上。其次,由于缺乏IT基础设施方面的投资以及完善的备份策略,数次因为网络原因或者服务器宕机,导致团队无法从中国访问版本管理服务器,正常的提交、更新操作都无法进行,最严重的是版本管理服务器曾经在发布之前出现故障,导致服务器上的数据不得不回滚到九天以前,给发布带来了很大的风险。

从现象上看,版本管理服务器不在本地是遭遇速度瓶颈的主要原因,本质却是由于版本管理工具不能很好的根据团队的规模和结构伸缩。对我们而言,比较理想的版本管理解决方案是在中美两地架设服务器,加快各个操作的执行速度,服务器之间自动同步来平衡两地对于速度和代码集成的要求。然而采用Subversion 作为版本管理工具,决定了服务器仅能架设在一地。SVK可以解决部分问题,但它的缺陷太多,操作起来非常不便。我们所面临的备份问题则是由于在Subversion的设计中,所有的元数据仅仅保存在服务器上,一旦服务器出现意外,元数据所包含的宝贵信息便无从恢复。之前的教训让我们认识到如果采用Subversion作为版本管理工具,就不能仅仅乐观的假设服务器不会出错,必须有详尽可行的备份计划,通过不断备份来规避风险。

Subversion的这些天生缺陷让我们把目光投向了DVCS(分布式版本管理工具),在这个家族中,比较成熟的产品有GitMercurialBzr,相比之下,由于Mercurial对Linux,Mac和Windows平台有良好的支持,支持通过Web方式访问代码库,并存在成熟的IntelliJ、Eclipse插件,最终成为了胜出者,时至今日,它已经在我们团队服役超过1年了,从0.9.4到1.1.2,每一次版本的更新,都让我们愈加喜欢这个设计精巧产品。那么较之Subversion,Mercurial究竟胜在哪里?

快速可靠

Mercurial带给团队的第一个体验就是快,原因很简单,由于DVCS的工作目录与中央仓库(Central Repository)别无二致,同样保存了全部的元数据,那么Subversion需要通过网络完成的操作(诸如提交、追溯历史、更新等), Mercurial可以在离线条件下通过操作本地仓库完成(图-1)。

图-1

通过减少与中央仓库的通信, Mercurial加快了操作速度,减小了网络环境对团队的影响,非常符合我们的需求。这种速度和可靠性的提高,对于时刻与版本管理工具打交道的开发者是一种非常愉悦的工作体验。此外,包含了全部元数据的工作目录可以在中央仓库出现问题时(图2-b)成为备用仓库(图2-c),而整个过程只需运行一条命令即可。

图-2

这样,在IS部门修复中央仓库的过程中,开发团队依然可以通过备用仓库交换修订,日常工作在没有中央仓库的情况下依然可以正常开展,中央仓库恢复后,再将宕机期间所有的修订通过备用仓库同步到中央仓库上(图2-d),这套机制可以作为经费和硬件设施有限团队的备份方案。即便中央仓库完全损毁,所造成的损失也非常有限,避免了使用CVCS时将“所有鸡蛋放在一个篮子里”的风险。

便于协同工作

在日常的工作中,我们常常利用Mercurial灵活的分支合并来共享修改,协同工作。几个月前在印度发布产品时,我需要在新的工作站上安装开发环境,由于代码库庞大而且网速缓慢,克隆中央仓库的操作需要花费数小时才能完成(图3-a),Mercurial的灵活性使我可以将工作站指向已经存有代码的笔记本电脑来执行克隆操作(图 3-b),在数分钟后工作站就完成了全部的克隆操作,之后再将它指向中央仓库(图3-c),即可正常提交/更新代码,大大节省了时间,提高了效率。

图-3

在另一个场景中,由于我所在团队使用Linux作为开发环境,在急于验证某些功能是否在Windows平台可以正常工作时,我们会将代码在Linux工作站本地提交,再将Windows工作站的工作目录指向Linux工作站,获取更新(图4-b)。之后,在Windows 平台验证功能,如果功能存在问题,可以修复后再将修订从Windows工作站提交到Linux工作站(图4-c),最终由Linux工作站运行测试并将全部更新同步到中央仓库(图4-d)。Mercurial的分布式特性让开发团队敏捷的分享修订,更有效率的开发。

图-4

对小步前进友好

本地仓库的存在,使Mercurial对小步前进更加友好 。小步前进意味着开发者在不破坏任何现有功能的前提下,每次修改少量代码并提交。这两个需求让使用集中式版本管理工具的开发者常常处于两难的境地,”不破坏现有功能“与“每次修改少量代码并提交”意味着存在便于分析的细粒度需求以及开发人员必须掌握增量式的对象建模、重构,数据库设计、迁移等技术。难于小步前进体现的是团队成员经验和技术的欠缺,然而解决这些问题不是一朝一夕之功,本地仓库的存在给了开发者更大的自由,允许开发者频繁提交而无需顾忌是否每一次提交都不会破坏现有功能,在代码经过若干次提交到达稳定状态时再与中央数据库同步。通过使用Mercurial,使得小步前进这个实践得以在团队开展,在大家体会到实践带来的好处后,再追求高质量的小步前进。

学习曲线低

Mecurial灵活的分支合并策略使我们可以选择与CVCS(集中式版本管理工具如Subversion,CVS等)非常相似的架构(如图-1所示),这样,团队在更换版本管理工具后依然可以工作在相对熟悉的环境中。在(图-1)所示的结构中,开发者需首先架设中央仓库,再从中央仓库克隆出工作目录,在开发过程中,开发者将修订提交到本地仓库,最后,在功能完成后将本地仓库的所有修改同步到中央仓库。除了最后一步,其余步骤和CVCS完全一致,开发者可以很快对Mercurial总体架构建立初步的认识。Mercurial的基本命令与CVS/Subversion非常类似,熟悉CVS/Subversion的团队可以依然工作在熟悉的命令行环境。从结构到命令,Mercurial做到了对CVCS用户友好,降低了学习曲线,让开发者可以相对轻松的跨出从CVCS到DVCS的第一步。如果仅仅想作一下尝试,又或者公司的政策不允许将版本管理工具从Subversion迁移到Mercurial,Mercurial还提供了HgSubversion插件可供选择,它可以将Mercurial作为Subverion的客户端使用,这样,既可以保留Subversion版本管理服务器,又可以在本地采用Mercurial来享受DVCS的种种好处,使开发者可以非常安全过渡到DVCS环境。

总结

毫无疑问Subversion是非常优秀的版本管理工具,但是它有自己的适用范围,并不是银弹。抛弃 Subversion,也不因为我们是新技术的狂热分子,而是它无法伸缩来适应团队的结构变化。对于希望尝试DVCS的团队,我的几个建议是:决策者首先要识别团队的痛点,对问题域有清醒的认识,而不能仅仅追赶技术潮流,其次是使用它、慢慢的接受它,如果团队仅仅止于理论方面的学习,各种方案的论证,是无法掌握DVCS并利用它来提高团队效率的,最后整个团队需要持续学习DVCS背后的设计思想,对于问题域的抽象以及丰富的插件的使用方法。这些知识将直接或间接的帮助团队提高进行代码版本管理的能力,更有效律的管理代码。

感谢

感谢我的同事杨哈达初悦欣乔梁和陈金洲在我写作过程中提供的无私的建议和帮助。和杨哈达的讨论让我对于DVCS的理论有了更清楚的认识,初悦欣和我一起重构了插图,乔梁和陈金洲对于文章的结构提出了很多意见和建议。

这篇文章是我在工作中从熟悉的Subversion迁移到Mercurial的经验分享,在这个过程中有不适应,也曾经犯了很多错误并获得了许多经验。希望读者能从这篇文章中有所收获,从DVCS在我们团队的实践了解到DVCS可能带给自己团队的价值,更有信心的进入DVCS领域。

作者简介

胡凯,ThoughtWorks敏捷咨询师,近2年一直从事持续集成工具Cruise以及CruiseControl的设计开发工作。 对于Web开发,敏捷实践,开源与社区活动有浓厚的兴趣,可以访问他的个人博客进行更多的了解。

阅读更多
想对作者说点什么? 我来说一句

分布式版本控制系统Git.docx

2018年04月25日 366KB 下载

没有更多推荐了,返回首页

加入CSDN,享受更精准的内容推荐,与500万程序员共同成长!
关闭
关闭