CVS心得点滴--关于tag和branch (一)

来源:互联网 发布:部落冲突 知乎 编辑:程序博客网 时间:2024/05/01 11:50
CVS心得点滴--关于tag和branch (一)
 
       不知不觉工作已经超过一年多了。在这其中参加了公司很多项目的开发与实施,频繁的使用着CVS这一工具。这篇文章就是想记录一下自己对CVS的一点使用心得,希望可以给刚刚接触这个工具的后来者一点帮助。同时也是抛砖引玉,可以在与大家交流的过程中提高自我。
      
    CVS (Concurrent Version Control System) 是一个能让很多程式开发者同时做软体开发的非常强大工具。对于它可能大部分软件工程师都应该有所接触,起码也是对这个名字如雷贯耳了。CVS的基本命令和使用,网上已经有了很多的教程,我就不再罗嗦。本文想介绍的,可以说是CVS的精华,同时又是对初学者来说很难理解和掌握的(包括当时我也花了很多精力去学习)的两个功能:tag和branch。
 
一、 tag
 
    1.1 revision number(修订号)
       要理解tag,首先要介绍一下revision number(修订号)。在CVS中每个文件的版本都有一唯一的 revision number。修订号的形式一般是这样的:`1.1',`1.2',`1.3.2.2' 甚至是 `1.3.2.2.4.5'。一个修订号总有偶数个用句号分隔的十进制数。按照默认,文件第一个修订号是 1.1。每个新的修订号的最右边的数会比它的上一个修订号的最右边的数大 1。下图显示了一些修订号,较新的版本在右边。
 
            +-----+    +-----+    +-----+    +-----+    +-----+
            ! 1.1 ! ----! 1.2 !----! 1.3 !----! 1.4  !----! 1.5 !
            +-----+    +-----+    +-----+    +-----+    +-----+
     其实,对于大多数 cvs 用户来说,不需要考虑修订号;他们只要知道 cvs 已经自动地加上了类似 1.1,1.2 之类的修订号就可以了。
 
       1.2 tag (标签)
    由于每个文件都有自己的修订号,每次提交该文件一次,它的修订号就会就会增加。这样就会产生一个问题:对于软件的某一个发行版,源文件的修订号可能都不一样。例如:
     ci.c            5.21
     co.c            5.9
     ident.c         5.3
     rcs.c           5.12
     rcsbase.h       5.11
     rcsdiff.c       5.10
     rcsedit.c       5.11
     rcsfcmp.c       5.9
     rcsgen.c        5.10
     rcslex.c        5.11
     rcsmap.c        5.2
     rcsutil.c       5.10
    因此,要checkout某一个特定的发行版的所有源码的时候,如果是要根据修订号来的话,是异常繁琐和难以跟踪的。这个时候,就要用到CVS提供的很炫的一个功能了:tag(标签)。
      
       标签可以用来标记多个文件的一组修订号,你可以想象标签以文件名为横轴,以版本号为纵轴绘制了一个曲线图(或者也可以想象成在一个由文件名和版本号组成的矩阵里面绘制的曲线)。以下面的4个文件为例:
    

figs/ecvs_0401.gif

 
    在过去的某个时候带 * 的版本号已被标记上标签。你可以把标签想象成一条经过所有被标记的文件的曲线。当你抓住线就得到所有标签标记的版本了。也可以通过另一种方式来看待这一点:把被同一个标签标记的所有版本号经过的曲线拉直, 然后直直地看过去,就象下图所示的一样:

figs/ecvs_0402.gif

 

 
    1.3 tag命令的用法                                                              
       下面的例子说明了怎样给一个文件添加标签。命令必须在模块的工作目录中发出。也就是说,你应该在 backend.c 文件所在的目录中发出该命令。
 
     $ cvs tag rel-0-4 backend.c
     T backend.c
     $ cvs status -v backend.c
     ===================================================================
     File: backend.c         Status: Up-to-date
    
         Version:            1.4     Tue Dec 1 14:39:01 1992
         RCS Version:        1.4     /u/cvsroot/yoyodyne/tc/backend.c,v
         Sticky Tag:         (none)
         Sticky Date:        (none)
         Sticky Options:     (none)
    
         Existing Tags:
             rel-0-4                     (revision: 1.4)
    
    很少对单个孤立文件添加标签。一种更常见的用法是在产品开发周期中的各个里程碑任务完成后对一个模块的所有文件添加标签,比如在发行版完成的时候。
 
     $ cvs tag rel-1-0 .
     cvs tag: Tagging .
    T Makefile
     T backend.c
     T driver.c
     T frontend.c
     T parser.c
 
    (当把一个目录作为 cvs 的一个参数的时候,该命令不仅对该目录下的所有文件执行操作,而且也会递归地对该目录下的所有子目录中的文件执行操作。)    
 
       如果要检出一个模块的某个版本,可以使用checkout -r命令。在 checkout 命令中使用 `-r' 标志可以检出一个模块某个版本。下面的命令可以很容易地取出模块 `tc' 1.0 发行版的所有源文件:
 
     $ cvs checkout -r rel-1-0 tc
 
        1.4 什么时候使用tag
        tag的功能就像是给你的工程的某个时刻建立了一个快照。添加了tag后,不论你最源文件做了任何修改,只要发现你的修改发生了错误,或者是如果有人宣称在某个版本里有个 bug,但你在当前工作的副本中是找不到那个 bug,都可以根据tag重新rollback回去,或checkout出那个快照。
        tag给开发人员带了这样的便利,因此在任何重要的开发阶段,都应该打上tag。
 
        一般性的,在下面的情况都应该考虑给你的工程简历一份快照(tag):
        完成了某个重要的功能
        在每一个milestone
        在去掉某个存在功能之前
        在测试开始之前
        在你对源文件做重大修改之前
        新建分支(branch,下文会详细谈到)的时候
        很并分支之前
 
       当然了,这些都是一般性的建议。其实我感觉是只要你觉得做的修改可能会有副作用的时候,就应该打上tag。
 
(待续。。。)
原创粉丝点击