版本控制系统或资源管理系统是现代软件开发的一个重要方面。不使用版本控制系统就如同超速驾驶一辆汽车:很刺激,也可能会更快抵达目的地,但事故却在所难免。本文概述了软件配置管理(SCM)系统及其优势,内容涵盖 CVS、Subversion、Arch 和 Git。本文还讨论了最常见的 SCM 体系结构。本文在最后给出了新出现的一些方法及这些方法与先前方法的区别。
什么是软件配置管理?
在学校学习的重要工具中,通常不会 包含 SCM。软件(或资源)控制,正如其名字所暗示的那样,是一种工具和一种相关的过程,而这种过程被用于维护源代码及其演进。SCM 提供的主要功能如下:
|
所以,SCM 允许您控制存储库中的一组文件并跟踪这些文件的修订。其他开发人员更改了存储库中的这些文件后,SCM 会标识出这些变更与您所做的变更之间存在的冲突,然后自动将其合并或通知您存在冲突。这个功能非常重要,因为它允许多个开发人员修改同一组文件。SCM 还能跟踪出谁做了何种变更。SCM 还允许您将文件按逻辑划分为相关的文件组,比如组成软件图像或可执行文件的源文件。
SCM 的术语
在深入研究 SCM 体系结构的类型和细节之前,先要熟悉一下术语的含义。存储库 是文件存储和管理的中心位置(有时又被称为树)。从存储库中取出文件放到本地系统的工作文件夹的过程被称作签出。如果变更了本地文件而又想同步变更存储库,就需要执行更新。如果要将变更后的文件签入到存储库,就需执行提交。如果所变更的文件先前已经被变更并已由别人提交,则会发生合并,表明两组变更集将会被合并在一起。若由于变更冲突的原因不能合并时,则必已发生了冲突。在此情况下,提交被拒绝,并要求开发人员手工合并变更。当提交了变更之后,就会创建此文件的一个新的修订。
一个或多个开发人员可以对主树(存储库的当前头)或位于主树旁的单个的分支进行操作。这就让开发人员可以操作分支而不会影响到主树。当分支稳定后,再将分支与主树进行合并。
要标记源树演进过程中的重要阶段,可以对一组文件修订应用标签。这会将这组文件组合成一个有用的集合(有时会用作针对于惟一构建的文件的一个发布)。
体系结构
各种 SCM 间有许多的差异,其中有两种最基本的区别很值得研究:
集中式存储库与分布式存储库
现代 SCM 体系结构的最为重要的差异之一是存储库是集中式的还是分布式(分散的)。当前最为常见的体系结构是集中式存储库。这个星型 体系结构由中心的源存储库和工作于这个存储库的多个开发人员组成(参见图 1)。开发人员从中心存储库签出源代码到本地的沙箱内,进行变更后,将它提交回中心存储库。其他开发人员就可以再访问这些变更。
图 1. 在集中式体系结构中,所有开发人员都通过同一个中心存储库进行工作
中心存储库也可以创建分支,允许多个开发人员协作于针对位于存储库(但必须在 mainline 或 tip 之外)的资源的一组变更。
分布式体系结构则允许开发人员为其变更创建其自己本地的存储库。本地开发人员的存储库与原始的存储库(已被分布)很相似。主要的区别是:在集中化的方式中,变更是在沙箱内完成的,而在分布式方法中则允许开发人员工作于分离的存储库。开发人员进行变更、提交变更到其本地的存储库,之后,在不影响主干的前提下,与其他开发人员的变更合并。这样,本地开发人员就使得变更集对上线(upline)开发人员可用(参见图 2)。
图 2. 在分散体系结构中,开发人员通过其各自的存储库员同步工作
分散体系结构很有意思,因为它允许不同的开发人员在对等网络内同步工作。当工作准备好(最好是稳定)后,开发人员可以分发变更集(或修补)以使他人也可以使用这些特性。这是当今许多开源系统的模型,包括 Linux® 内核。
[1] [2] [3] [4] 下一页