第一章:基础
A tale of two trees
开始之前先讲解一下基本的术语和操作. 一个是存储区,一个是工作目录.
一个SCM工具提供一个存放源代码的地方,我们称之为"存储区",一般存放在服务器上,并共享给当前团队的所有成员.
每个开发人员都有自己的工作目录,一般存放在工作的机器上,并通过一个客户端程序访问.
所有内容都基于目录层次结构,存储区中的一个文件主要根据其路径来定义描述,就象普通的文件系统中一样。在Vault和SourceSafe中,存放路径必须$开头,如:
$/trunk/src/myLibrary/hello.cs
一个开发人员的基本工作流程看起来应该是这样:
- 拷贝存储区内的内容到当前工作目录;
- 在当前工作目录内修改代码;
- 更新这些变更到存储区;
- 重复以上步骤.
在此省略了会议、休假之类的事,不过对于一个开发人员而言,使用SCM工具就只有上面那些步骤了。存储区用于保存所有完成的工作。如果存储区内没有一项任务的交付物,则不认为这项工作已经完成。
让我们考虑一下没有工作目录和共享存储区的情况,如果是一个独立的开发人员,则是可以接受的,针对多人的开发小组,则情况会很混乱。
我曾看见有人尝试过。代码存放在一台文件服务器上,每个人都通过windows共享修改代码,当某个人想修改main.cpp时,他们会大声问是否其它人在使用此文件.网络带宽大部分消耗编译代码上,当我向他们推销我的产品时,我感觉就象一个ER医生(译者注:ER Doctor)。那天晚上回到家里,我真的很高兴,因为我知道我又救了一条"生命".
最佳实践:不要破坏版本树
当存储区被破坏之后,工作目录的好处几乎都失去了.任何时候,存储区应该处于一种让任何成员可以继续工作的状态.如果某个成员签入的代码不能编译或测试通不过,所有成员的工作都受到了影响.
许多团队对破坏者都有相应的"惩罚",并非是很严厉的处罚,需要象征性的提醒其它成员注意.如罚款1美元(积少成多,以后可以做团队费用).另一种惩罚就是让他做公益劳动,只是让他感到不好意思,而不是真的惩罚.
一旦有了SCM工具,多人团队就简单多了.每个开发人员有自己的私有目录,他可以在自己目录里做修改而不用影响他人.
注意:并不是所有SCM工具都与这里使用的术语相同.许多系统使用"目录",而不是"文件夹".VSS使用"数据库",而不是"存储区".In the context of Vault, these two words have a different meaning. Vault allows multiple repositories to exist within a single SQL database. For this reason, I use the word "database" only when I am referring to the SQL database. (这段文字为该产品的说明,不作翻译.)
入 和 出
存储库一般存放在专门的服务器上,而与开发人员的工作目录"远远"分离.之所以说"远",是因为可能相隔几寸,或远在几千公里之外.物理距离其实没什么意义.一般SCM工具提供通过TCP/IP在客户端和服务器之间交流的手段,无论是以太网还是互联网.
由于工作目录和存储区的分开,SCM工具中大多的特征就是帮助开发人员在两者之间来回传送数据,一般有如下操作:
Add: 存储区开始时一般是空的,因此我们需要往里面添加东西,在Vault中使用"添加文件"你可以将本地的文件或目录添加到存储区中;
Get: 当我们从存储区拷贝内容到工作时,这个操作就叫"Get",要注意的是这个操作主要针对我们不打算修改的文件,这些文件在我们的工作目录是只读状态;
Checkout: 当我们想取得文件并编辑时,这个操作就叫"签出".这些文件在我们工作目录中会被标记为可读,而SCM服务器会记录我们的签出点;
Checkin: 当我们修改之后要保存到存储区时,我们就使用"签入"操作.本地目录的文件又会被标记为只读,而SCM服务器就会更新存储的内容到新的版本.
上面这些定义只是很简单的初级定义,只是针对SourceSafe或Vault的操作的缺省描述.而后面谈到的工作如CVS会略有不同,当然Vault也可配置为与CVS相同的工作方式.
术语的区别:有些SCM工具可能在字词上有所不同.Vault和SourceSafe使用"checkout"表明要编辑一个文件,而CVS则使用"checkout"得到文件,无论你打算编辑与否.有些SCM工具使用"commit"表示签入,而不是"checkin".事实上,这些术语在Vault中都会使用,在后面的章节中有介绍.
H.G. Wells would be proud
你的存储区并不仅仅是你当前代码版本的一个集合.事实上,它是代码的各个版本的集合.存储区中包含有扬有修改历史,保存了每个文件的所有变更版本号,因此,版本控制看起来就象是一部时间机器.
回退到软件的某一个时间点对一个项目而言是非常有用的,假如我们需要取得代码在2005-9-8的一份拷贝,使用SCM工具是非常容易做到的.
一种更常见的情况是当一段代码看起来有点奇怪,其它人都不易理解的时候,可以回溯这段代码的历史,了解修改的人和时间,及相关变更描述来了解修改的原因.
随着时间的推移,存储区会变得非常庞大和臃肿,因此SCM工具提供了相应的解决机制.在Vault中,提供历史浏览器查看以前的内容,可以搜索和排序.
也许对一个SCM工具而言,最重要的是使用标签.一个标签用于在一个特定时间上对存储内容设置一个有意义的名称,而且可以在以后很容易的根据标签取得当时的所有内容的一个快照.
接下来
本章简单的介绍了一下SCM工具能做什么,主要好处有两点:
- 工作目录给开发人员提供了私有的空间;
- 存储区的历史记录保存了每次所做的变更和原因.
下一章主要讲述checkin.
原文出处:http://software.ericsink.com/scm/scm_basics.html
|