本文是“每日构建[4]:相关工具介绍
”的第一部分。
由于源代码版本控制系统(Revision Control System,以下简称RCS)属于“每日构建流程
”的头一个环节,所以俺在介绍每日构建的相关工具时,先来聊一聊RCS类的软件。<!-- program-think-->
★老派的RCS
在整个软件开发的生命周期中,RCS处于一个很基础的位置。很多软件工程的环节都会依赖于它。所以,RCS对于整个软件开发过程而言,是非常重要的。但是却有很多软件公司仍然在使用一些比较陈旧落后的RCS。因此,有必要先抨击一下这些老古董的弊端。
◇VSS
要说老派的RCS,首推微软的Visual Source Safe(简称VSS)。VSS的设计是相当的老土,对源代码库的访问是基于局域网的共享文件夹方式。共享文件夹的方式那是要多土有多土:不光效率低下,而且容易产生安全隐患。
光是设计老土也就算了,毕竟人家是九十年代早期设计的,那会儿TCP/IP还没流行呢!VSS还有更严重的问题,就是:误导
了开发人员的对于源代码管理的观念(比如它对文件的锁定模式)。估计有很多开发的新手就是这样被带到沟里去的,以至于长期以来,一直有人在为VSS的锁定模式辩护。
当然,VSS还是有少量优点的,比如:捆绑在Visual Studio中,和VS的其它套件整合得比较好。但是这少数优点远远不能抵消它那些严重的缺点。因此俺强烈建议:那些还在用VSS的同学,赶紧换掉吧
!万一让别人知道你还在用VSS,以后上街都没脸跟人打招呼。如果大伙儿觉得俺说得太夸张,可以去看看牛人Coding Horror写的帖子(在“这里
”)。
◇CVS
骂完VSS,再稍微说一下曾经广为流行的CVS,(官方站点在“这里
”)。
显然,CVS的优点比VSS多多了。想当年,CVS几乎成了源代码版本管理的代名词。那会儿,大部分的开源项目都使用CVS进行代码管理。不过,用的人
多了之后,大家开始发现CVS的一些弊端(比如不能改名文件/目录、比如不支持对目录的版本控制、比如Unicode/UTF8支持不够好、比如版本提交
的原子性、比如......)。
有些人受不了CVS的某些缺点,开发了一个改良版的CVSNT
。这玩意儿俺曾经用过几年,比CVS好些,不过几个致命的缺点还在(比如上述提到的改名问题);还有些人更加激进,干脆另起炉灶,搞出全新的RCS(比如后面提到的SVN,就是为了取代CVS而设计的)。
据俺的观察,目前RCS市场的趋势已经比较明显了:很多后来居上的RCS正在逐步侵占CVS的市场份额。长此以往,CVS的人气和份额将会逐年下降。不过它暂时还不会消亡,毕竟还有很多老用户还在用它。
所以,俺对CVS的观点是:还在用CVS的同学也可以考虑换一换了。不过捏,假如你暂时不想换,问题也不算太大(至少CVS的问题没VSS那么严重:-
)。
★新潮的集中式RCS
批完老派的RCS,接着来说说近几年比较时髦的RCS。为了循序渐进,俺先从集中式的RCS说起。
在新潮的集中式RCS软件中,SVN(全名叫subversion)是比较有代表性的(官方站点在"这里
")。俺就重点来说说它。
◇SVN的优点
其实SVN相对于CVS的优点很多,限于篇幅,俺只挑主要的优点介绍。
1、能够导入多种RCS的代码库
稍微懂行的人都知道,RCS迁移是一项很严肃的事情,不可等闲视之。如果新的RCS不能很好地导入原有RCS的代码库,那你肯定会死得很难看滴。
SVN在这点上是比较成功的:由于它的影响力比较大,自然会有一些第三方的工具提供代码库的导入功能。比如SVN Importer
,可以把其它很多种RCS(比如CVS、PVCS、MKS、ClearCase、SourceSafe)的代码库迁移到SVN。另外还有cvs2svn
,专门用来导入CVS代码库。通过这些工具,你可以完整地保留原有代码库的所有历史版本。
2、和CVS的使用类似
另外,SVN的一些常用命令、概念、操作习惯都比较类似于CVS(当然,差别还是有的)。比如俺在CVS下经常使用的TortoiseCVS
,也有对应的SVN版本(TortoiseSVN
)。两者就像双胞胎,连界面风格都很像。所以,开发人员从CVS切换到SVN的学习周期会很短,阻力也会很小。
3、支持文件/目录改名
这个问题一直是CVS的致命伤,SVN没理由不搞定。
有了这个功能之后,就可以直接在客户端进行文件的改名操作。拥有新名称的文件,会继承原有文件的版本历史。
4、和Web密切整合
这年头,Web越来越成为主流、B/S的操作方式也开始深入人心。SVN迎合了这种趋势,和Apache绑定在一起。由于深度整合了Web,很多版本管
理的操作都可以直接在浏览器上搞定,巨简单的说。另外,Apache作为头号Web Server,功能、性能、安全性自然无可挑剔。
5、能很好地整合其它的开发工具
得益于SVN的设计理念和开源社区的人气,有越来越多的开发工具都可以和SVN无缝整合。比如在Bug管理方面,有:Trac
、Bugzilla
、Mantis
;至于各种编辑器/IDE的SVN插件,那就更多啦,俺不再一一列举了。
◇SVN有些啥缺点
1、不支持分布式
这是比较明显的缺点。俺后面会提到,集中式相对于分布式具体有哪些缺点。
2、性能
感觉SVN在性能方面不咋滴,包括操作速度和存储空间,都不太理想。如果和后面提到的分布式RCS相比,这个缺点会更加明显(尤其是在代码commit的时候)。
3、到处散落.svn目录
其实这个问题倒不是什么大问题(CVS也有此毛病)。或许某些有洁癖的人看着那么多.svn会很不爽。俺自己倒是无所谓。
★新潮的分布式RCS
◇集中式和分布式的区别
分布式RCS和集中式的主要区别在于:
对于集中式RCS,只有一个中央代码仓库,每个开发人员自己机器上维护一个工作拷贝(working
copy)。开发人员本地的代码在没有提交之前,是无法被RCS管理的,因此就无法进行各种操作(比如创建分支)。一旦你的开发机器和中央代码仓库的网络
连接断掉(比如你把笔记本带回家写代码),你就只好干瞪眼,无法进行后续工作。
对于分布式RCS,每一个开发人员的机器上都有一个代码仓库。你随时都可以提交到本地的代码仓库中。分布式RCS可以在网络连通的时候,再进行各个代码仓库之间的数据同步。
为啥这几年,分布式的RCS多起来捏?一个主要的推动力来自于开源社区。大部分开源项目的开发人员都分布在世界各地,有些人受限于网络因素,不能很流畅地和代码仓库交换数据。在这种情况下,分布式RCS的优点就体现出来了。
◇哪些公司适合分布式的RCS
俺个人认为,一般的软件公司,使用分布式RCS的优点不如开源团队那么明显。但是在如下几种情况,你可以考虑采用分布式RCS。
1、开发团队的地域性分隔
比如公司的开发团队分散在不同的城市,而且互相之间的网络连接不稳定。这有点类似于开源项目的团队,因此可以考虑采用分布式RCS。
2、在公司之外开发
所谓的“在公司之外开发”,主要有如下几种情况:比如开发人员喜欢在回家之后干活、比如开发人员经常去客户现场干活、比如公司雇佣兼职人员在家干活。
不过这些情况都有一个前提条件,那就是:公司既没有搭建VPN,而RCS又无法从公网上访问。在这种情况下,才值得用分布式RCS。
◇几个常见的分布式RCS
分布式的RCS,名气比较大的有:Git、Mercurial、Monotone、Bazaar。下面俺大致说一下头两个。
1、Git(官方站点在“这里
”)
俺个人感觉,Git的最大亮点和卖点就是:它的创始人是Linus。单凭Linus这个金字招牌,Git就吸引到很多人气。而且Git在各方面的功能还是比较齐全的。
它的主要缺点就是对Windows系统支持不太好(想想也是,Linus本人是Linux它爹,对Windows支持不好也在情理之中啊)。不过现在情况略有好转:Windows下的GUI客户端TortoiseGit
才刚出来不久,将来如果能做到像TortoiseSVN
那么成功,那Git在Windows下就前途光明了。
Git的成功应用案例,俺不说大伙儿应该猜得到是:Linux Kernel。光这一个就足够说明问题了。
2、Mercurial(官方站点在“这里
”)
Mercurial是另一个比较牛的分布式RCS。它还有一个绰号叫Hg。化学比较好的同学,应该会立马联想到:Hg是元素周期表中“水银”的缩写。
Mercurial的特色是基于Python开发,所以它在跨平台方面,会比较有优势。另外,它在Windows上的GUI客户端TortoiseHg
也比TortoiseGit
要成熟一些。
Mercurial相对于Git的缺点是性能不够好。没准和基于Python开发有关,不过也有可能是Git的性能太过优秀。
Mercurial的成功应用案例有:Mozilla、OpenSolaris、NetBeans。这几个也都是重量级的项目。
版权声明
本博客所有的原创文章,作者皆保留版权。转载必须包含本声明,保持本文完整,并以超链接形式注明作者编程随想
和本文原始地址:
http://program-think.blogspot.com/2009/06/opensource-review-revision-control.html
分享到:
相关推荐
- `huanyuan`:可能是系统特定模块或者插件的命名,具体功能需查看源代码才能确定。 - `attachs`:附件目录,用于存储上传的图片、文档等用户数据。 - `admin`:后台管理界面的相关文件,包括登录、权限控制、...
当当网源代码是互联网上广泛讨论的一个话题,尤其是对于那些热衷于电子商务系统开发和研究的人们。这个源代码提供了一个全面的 MVC(Model-View-Controller)框架,使得开发者能够深入了解一个成熟的网上书店系统的...
【php论坛管理系统源代码】是一种基于PHP编程语言的开源应用程序,专为构建在线社区和讨论平台而设计。这个系统能够帮助用户实现互动交流,提供发帖、回帖、用户注册、权限管理等功能,是学习PHP开发和理解Web应用...
通过分析这些源代码,我们可以学习到如何在Java中读取音频文件、控制音频流、处理音频数据以及与其他系统进行交互。对于初学者,这是一个很好的起点,可以深入理解音频处理的基本原理和实践技巧。对于有经验的开发者...
《驾校管理系统源代码详解》 驾校管理系统是一款专为驾驶培训学校设计的单机版软件,其核心功能在于帮助驾校高效管理学员信息、课程安排、考试预约等日常事务。虽然该系统未涉及线程和线程锁,但其丰富的代码量使其...
该系统经过优化,用户评价良好,且提供源代码,适合开发者进行深度定制。可能包含的主要文件结构和组件可能有: 1. 核心框架:包含系统的基础架构,处理请求、路由、会话管理等。 2. 数据库模型:用于与数据库交互...
公开源代码允许其他开发者研究、学习、修改和扩展系统,促进开源社区的发展。 4. **C#编程**:作为.NET的主要编程语言,C#具有现代编程语言的特性,如面向对象、类型安全、垃圾回收等,适用于开发复杂的业务逻辑。 ...
10. **版本控制**:Git等版本控制系统可能用于项目管理,确保代码更新和协作的高效进行。 11. **部署与运维**:Apache或Nginx等Web服务器用于部署应用,Docker容器化技术可能用于简化部署和维护。 12. **开源社区*...
毕业设计管理系统源代码是软件开发领域的一个重要实践项目,它涵盖了软件工程的多个阶段,包括需求分析、系统设计、编码实现、测试与调试以及后期维护。这个“毕业设计管理系统源代码超级经典集合1”可能是一个综合...
5. **项目结构**:尽管没有具体的代码细节,但PICPRO可能是项目的主要源代码文件夹,可能包含头文件、源代码文件、配置文件和资源文件。开发者可能使用了面向对象的编程方式,将图像处理的不同功能模块化,例如读取...
【标题】"很全的bbs系统源代码"所涉及的知识点主要集中在构建一个网络论坛(BBS,Bulletin Board System)系统的技术实现上,这里的关键技术是基于Struts2框架的Java编程。Struts2是一个广泛应用的开源MVC(Model-...
【描述】中的“这是一款很好的jsp编写的跳蚤市场源代码 希望能够帮你”说明这个项目是开源的,允许用户查看和学习其内部工作原理。跳蚤市场通常指的是一个二手商品交易的平台,因此,我们可以预期这个源代码实现了一...
8. **版本控制**:通过查看源代码历史,可以学习Git等版本控制系统的工作方式,以及如何进行代码协作。 9. **测试与调试**:美团的测试框架和自动化测试策略,如何保证大规模系统的稳定运行。 10. **持续集成/持续...
开源意味着源代码公开,允许用户自由查看、修改和分发,这样可以吸引社区参与改进,增强系统的稳定性和功能性。 【标签】: - **B2C**:B2C代表Business-to-Consumer,是电子商务的一种模式,即商家直接面向消费者...
开源代码的共享意味着任何人都可以查看、学习甚至修改源代码,这对于初学者来说是一份宝贵的资源。通过研究这个系统,你可以: 1. 学习ASP编程基础,如变量声明、条件语句、循环结构等。 2. 了解数据库操作,如SQL...
【标题】"PHP实例开发源码——DSKMS在线培训开源视频管理系统.zip" 提供的是一个基于PHP语言的在线视频管理系统源代码。这个系统可能是为了帮助教育机构或个人创建、管理和分享在线视频课程而设计的。PHP是一种广泛...
开源CMS意味着其源代码对公众开放,开发者可以自由地查看、使用、修改和分发代码,这为社区提供了持续改进和定制系统的机会。 "最好的CMS代码"可能指的是在功能、性能、易用性、可扩展性和安全性方面表现出色的开源...
开源项目通常采用Git进行版本控制,通过GitHub或GitLab进行代码托管。源代码中可以看到提交历史和分支管理,这有助于团队协作和代码审查。 8. **持续集成/持续部署(CI/CD)** CI/CD是现代软件开发的最佳实践,...
- 订单系统:购物车、下单、支付接口、订单状态跟踪。 - 支付集成:与第三方支付平台如PayPal、Alipay、WeChat Pay的接口对接。 - 物流追踪:集成物流公司的API,提供订单的实时物流信息。 - 客户服务:客服聊天...
8. **版本控制**:`huacnlee-quora-08c5468`这个文件名暗示了项目使用Git进行版本控制,`08c5468`是某个Git提交的哈希值,表明了源代码的某个特定版本。 9. **链接资源**:`谷普下载.url`和`说明.url`可能是指向...