作者 胡凯 发布于 2009年3月16日
社区 Java, .NET, Ruby, 敏捷 主题 配置管理 , 协作 标签 最佳实践 , 协作技术 , 源代码
分享 |
Subversion曾经是我们亲密无间的战友,但自从一年前部分团队成员去了美国,我们和Subversion的关系就开始出现了裂痕,首先是将Subversion服务器架设在美国后,中国开发人员频繁进行的一些操作变得非常缓慢,本来通过追溯代码历史便可找出原因的问题,却因为网速缓慢,导致开发者将大量的时间耗费在等待服务器响应,而不是分析问题上。其次,由于缺乏IT基础设施方面的投资以及完善的备份策略,数次因为网络原因或者服务器宕机,导致团队无法从中国访问版本管理服务器,正常的提交、更新操作都无法进行,最严重的是版本管理服务器曾经在发布之前出现故障,导致服务器上的数据不得不回滚到九天以前,给发布带来了很大的风险。
相关厂商内容
QClub(大连站)架构设计专场-架构设计详解(7月23日 免费报名中!)
Flash Builder 4.5高级版试用版免费高速下载
视频演讲:Flash Player 10.3:新功能与增强
IBM WebSphere应用架构高峰会,探讨云计算最佳实践!(北京、南京、深圳免费报名!)
QClub(广州站)珠三角技术沙龙-HTML5专场(7月24日 免费报名中!)
从现象上看,版本管理服务器不在本地是遭遇速度瓶颈的主要原因,本质却是由于版本管理工具不能很好的根据团队的规模和结构伸缩。对我们而言,比较理想的版本管理解决方案是在中美两地架设服务器,加快各个操作的执行速度,服务器之间自动同步来平衡两地对于速度和代码集成的要求。然而采用Subversion 作为版本管理工具,决定了服务器仅能架设在一地。SVK可以解决部分问题,但它的缺陷太多,操作起来非常不便。我们所面临的备份问题则是由于在Subversion的设计中,所有的元数据仅仅保存在服务器上,一旦服务器出现意外,元数据所包含的宝贵信息便无从恢复。之前的教训让我们认识到如果采用Subversion作为版本管理工具,就不能仅仅乐观的假设服务器不会出错,必须有详尽可行的备份计划,通过不断备份来规避风险。
Subversion的这些天生缺陷让我们把目光投向了DVCS(分布式版本管理工具),在这个家族中,比较成熟的产品有Git、Mercurial和Bzr,相比之下,由于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开发,敏捷实践,开源与社区活动有浓厚的兴趣,可以访问他的个人博客进行更多的了解。
相关阅读
[ ThoughtWorks实践集锦(1)] 我和敏捷团队的五个约定。
[ ThoughtWorks实践集锦(2)] 如何在敏捷开发中做好数据迁移。
[ ThoughtWorks实践集锦(3)] RichClient/RIA原则与实践(上)、(下)。
分享到:
相关推荐
Subversion 将数据存储为文件集合,并记录每一次文件及目录的修改情况,这种元数据的形式就是所谓的“版本”。 - **版本控制的基础概念:** - **版本控制的基本原理**:通过跟踪文件和目录的变化来管理版本。 - *...
在学习Subversion时这个问题一定要注意。 Checkout的具体方式是: 在客户端新建一个空目录,比如:F:\Project1 在该目录上单击右键,在弹出式菜单中选中SVN Checkout..., 之后在“URL of Repository”文本框...
【Subversion(svn)安装与使用指南】 Subversion(简称svn)是一款强大的版本控制系统,尤其在Java团队开发中被广泛使用,它可以帮助开发者追踪代码的变更,管理多人协作时的版本冲突。本文将详细介绍在Windows...
TortoiseSVN是一款流行的Subversion版本控制系统的客户端程序,它以图形用户界面的形式出现在Windows操作系统中,为用户提供版本控制的便捷操作。TortoiseSVN允许用户管理文件和目录的版本,它与Subversion服务器...
### 版本控制与Subversion (SVN) #### 一、简介 **Subversion (SVN)** 是一种广泛使用的版本控制系统,它源自于早期的 **Concurrent Versions System (CVS)**,并在此基础上进行了大量的改进。SVN 主要用于软件...
接着,我们创建一个名为svnWeb的SVN仓库。在服务器端,使用SVN管理工具创建一个新的项目。在Eclipse中,我们也创建一个与之对应的项目,同样命名为svnWeb。将Eclipse项目中的文件复制到服务器上的svnWeb目录,然后在...
例如,如果我们要回滚到第20个版本,那么需要删除第21号及之后的所有文件夹。这是因为`revs`目录中的每个子目录代表一个版本,其名称即为版本号。 3. **清除版本属性**:除了版本记录,我们还需要清除与这些版本...
解决版本冲突需要使用 SVN resolved 命令来告诉 Subversion 冲突已经解决。解决步骤如下: 1. 在当前目录下执行“update”(更新)操作 2. 在冲突的文件上(选中文件--右键菜单—TortoiseSVN—Edit conflicts(解决...
SVN(Subversion)是一个广泛使用的版本控制系统,它帮助开发者管理和维护不同版本的文件和代码库。在多人协同开发的项目中,版本控制显得尤为重要,但同时也可能会出现代码合并冲突的情况。当两个开发者对同一文件...
标题 "清理svn标记快速方案" 涉及到的是如何高效地从本地文件系统中删除Subversion(SVN)的版本控制信息。Subversion是一种广泛使用的版本控制系统,用于跟踪和管理源代码和其他文件的变更。在开发过程中,有时我们...
TortoiseSVN是Subversion的客户端,它为Windows平台提供图形化界面,允许用户无需使用命令行即可进行版本控制操作。 1. TortoiseSVN 是Subversion的一个图形用户界面(GUI)客户端工具。它在文件资源管理器中集成,...
Subversion1.8之后,http资源类型支持库,apache从该版本之后,舍弃了neon。由于google官网下载比较麻烦,所有我这里分享给大家。好运!
Subversion(SVN)是版本控制系统,用于管理项目代码的修改和更新。版本冲突解决是指在 SVN 中解决冲突的过程。 版本冲突的原因可以分为两个方面: 1. 多个用户同时更新同一个文件,导致版本不一致。 2. 一个用户...
在本案例中,我们讨论的是TortoiseSVN的1.7.1版本,具体构建号为22161,适用于32位操作系统,并且包含了中文语言包。 TortoiseSVN的核心功能包括但不限于: 1. **版本控制**:TortoiseSVN允许用户跟踪文件和目录的...
在IT行业中,版本控制系统是开发团队协作的重要工具之一,Subversion(简称SVN)就是其中广泛应用的一款。然而,在某些情况下,我们可能需要清除文件夹下的SVN记录,例如在分享代码、清理磁盘空间或者迁移至其他版本...
`.svn` 文件夹是 Subversion(简称 SVN)版本控制系统在工作目录中创建的特殊文件夹,用于存储项目版本信息和元数据。Subversion 是一种分布式版本控制系统,它允许团队成员协同工作,跟踪文件和目录的变化,并能...
SVN,全称为Subversion,是一种版本控制系统,用于管理软件项目中的源代码、文档等文件的历史版本。它允许开发团队协同工作,记录每次修改,以便在出现问题时能够回滚到先前的状态,同时也方便了多人同时编辑同一份...