下面是非常基本的cvs update/commit操作规范:
简单的cvs操作约定
修改文件之前首先update。这意味着修改时的版本尽可能新,一旦发生冲突,解决它的工作量会比较小。
及时commit。本地代码与代码库中的代码差异越小,别人合并的难度也就越小(他们有比较大的概率能够拿到新的版本)
将不同的功能单元修改分开commit。一方面,这样做能够尽早地commit,减少别人合并的难度;另一方面,由于cvs提供了回退到先前版本的能力,一旦由于某项功能修改造成问题,也很容易将那次修改的内容,而不是整个修改回退到正常的代码。
同一功能涉及的所有代码一次commit。不希望将涉及同一功能修改的代码分开commit,因为这会给日后的追踪带来麻烦。
先调试后提交。这将减少别人不会因为同步了中间结果引发问题,甚至发生提交冲突的可能。
写清commit log(提交日志)。cvs中允许保存commit log,在这里可以写为什么进行代码的修改,以及进行了什么样的修改,清楚的commit log能够帮助其他开发者在不仔细阅读代码的情况下了解修改的内容,从而极大地提高开发效率;另一方面,这些日志对于开发者自己,以及整个开发团队,都是非常宝贵的财富。
同步代码(update)和提交代码(commit)占到了cvs日常操作的80%以上。从上面的介绍我们可以看出,仅仅依靠这两项非常简单的功能,cvs就能极大地改善开发流程,并提高软件工程的可控性。简单地说:
全体开发者使用同一个中央代码库,从而消除了由于来回复制文件导致的不一致。
发生冲突时,后提交的开发者必须解决它。这名开发者能够知道是谁引入了冲突,他可以自己解决冲突,也可以与引入冲突的开发者商量如何解决冲突。
测试可以贯穿编码过程的始终,任何时候引入的新问题都能够被及时追踪、快速定位,从而更有效地解决。
由于存在中央代码库,代码审核人员和每日构建人员能够及时地了解代码是否存在问题,并帮助项目经理保证开发进度。
有助于帮助开发人员养成严谨的工作习惯——规则要求他们将尽可能地提交正确的代码,并且每个修改必须写commit log进行说明。
有助于建立更公平的工作质量评估机制。 cvs能够记录每个人完成的实际工作量,包括他们因为修正问题等等所作的劳动,以及他们完成代码的质量情况。这样,管理者能够为优秀的开发人员提供更好的工作机会、报酬,等等,这对于鼓舞整个团队的士气、提高开发人员的工作积极性都是非常有益的。
促进开发人员之间的交流。尽管cvs本身无法代替交流,但commit log,以及cvs系统获取任意版本之间差异的能力,能够帮助开发人员了解对方的想法,并促进他们共同提高。
降低程序开发人员的门槛。由于提供了许多非常方便的协同开发手段, 使用cvs能够减少协同开发所需要的磨合期,同时,不同层次的开发者之间由于能够进行经常性的沟通,从而把编码过程从技能型工作向熟练性工作又推进了一步。这意味着高层次的开发人员能够去进行更能发挥他们特长的工作,而新手则可以很快地融入到日常的开发活动中来,从而提高劳动生产率,降低开发成本。
编码过程中的沟通纽带——commit mail
cvs是一项开放性很强的工具,它可以被非常容易地订制。一般来说,cvs服务器会架设在一台Unix主机上(我们推荐使用FreeBSD),通过使用脚本语言(例如,Perl),cvs能够完成一些额外的功能。
commit mail是commit log在邮件系统上的延伸。下面是一封典型的commit mail,它来自FreeBSD开发团队:
phk 2003/10/21 23:32:20 PDT
FreeBSD src repository
Modified files:
sys/geom geom_io.c
Log:
Forgotten commit: If a provider has zero sectorsize, it is an
indication of lack of media.
Tripped up: peter
Revision Changes Path
1.50 +3 -6 src/sys/geom/geom_io.c
我们看到,上面的这封commit mail中提到了开发者(phk)、提交时间(太平洋时间2003年10月21日23:32:20)、涉及的代码库名字(FreeBSD src repository)、修改过的文件(sys/geom的geom_io.c)以及commit log。最后,commit log还提到了提交后文件的最新版本(1.50),修改规模(+3 -6)以及代码的实际路径。
实现上面的功能并不复杂,实际上,您只需要下载一套经过定制的FreeBSD cvs代码库(压缩包不超过40KB),并作少量的调整,就能够直接使用这些功能(我们将在不久以后发布这些内容)。进行这些订制甚至不需要基本的Perl和C/C++常识就能够完成——当然,我想这样的常识对于软件开发人员来说,并不算是很高的要求。
commit mail可以通过邮件列表发给全体开发者。许多大的软件公司,以及开放源代码团体,都采用这样的方式来协调开发活动。