490 likes | 697 Views
CVS 与配置管理. 刘学敏. CVS 是什么. Concurrent Versions System 的缩写, Concurrent 有并发的, 协作的, 一致的等含义. CVS 是一个版本控制系统。使用它,可以记录下源文件的历史. 使用 CVS 的好处. 保存源代码的全部历史,还可以保存相关的软件文档等. CVS 用一种聪明的办法(仅仅保存不同版本之间的区别)来保存一个文件的所有版本在一个文件里 支持团队协同开发.提供多种途径帮助小组成员之间的版本同步、开发通信,辅助解决代码冲突,大大提高协作效率。
E N D
CVS与配置管理 刘学敏
CVS是什么 • Concurrent Versions System的缩写, Concurrent有并发的, 协作的, 一致的等含义. CVS是一个版本控制系统。使用它,可以记录下源文件的历史
使用CVS的好处 • 保存源代码的全部历史,还可以保存相关的软件文档等. CVS用一种聪明的办法(仅仅保存不同版本之间的区别)来保存一个文件的所有版本在一个文件里 • 支持团队协同开发.提供多种途径帮助小组成员之间的版本同步、开发通信,辅助解决代码冲突,大大提高协作效率。 • 帮助发现bug.经过对不同版本的比较,开发者能较方便地找出是哪一次变动引起bug
CVS的安装 • 软件安装 http://www.cvshome.org上现在源码, 看安装文件夹下的INSTALL文件,手册没有关于软件安装的指导. ./configure 常用指定目录的方式/configure --prefix=/usr/local/gnu make make install
CVS的安装 • 服务配置 9-可以单独(standalone)运行,也可以inet super_server的方式. 前一种比较占资源,但速度快,一般将可执行的命令放在/etc/rc.d/rdc.local下即可 后一种节省系统资源,但比较慢
CVS的安装 • #> cd /etc/xinetd.d service cvspserver { disable = no flags = REUSE socket_type = stream wait = no user = root server= /usr/bin/cvs server_args= -f --allow-root=/home2/cvsroot/project1 --allow-root=/home2/cvsroot/project2 pserver }
CVS的安装 • 由于xinetd的server_args长度限制,想运行很多的单个仓库的时候,可以这么做 server = /cvsroot/cvs.run 编写cvs.run脚本 #> vi /cvsroot/cvs.run /usr/bin/cvs -f \ --allow-root=/cvsroot/project1 \ --allow-root=/cvsroot/project2 \ pserver
CVS的安装 • 建立源码仓库 cvs -d /usr/local/cvsroot init . 会在cvsroot下创建一个CVSROOT目录,存放管理文件.
CVS的使用 在版本控制中,存储在源码库中的文件统称为历史文件(history files),这些文件的名称是在对应在工作目录中的文件名称后面加上,v,历史文件中包括有足够的信息来再创建文件的任何一个修订版
CVS的使用 • 控制访问权限 有两种方法: 一是使用CVS自己的用户认证机制 二是使用linux系统的用户认证机制.
CVS的使用 将config文件的#SystemAuth=no前的注释去掉;在config下增加passwd文件,格式如下: trotter:*****:cvsroot gary:*****:lsf trotter,是登陆的用户名 , 中间的*是加密后的密码, cvsroot表明登陆后 的权限相当于本地用户cvs的权限. trotter与系统中的用户没有关系
文件权限 • 根据对文件所在目录的权限决定对下面文件的权限,所有的,v文件全部被设置成只读,并且,不能改变那些文件的权限。在源码库里的目录对于在每个目录里都有修改文件权限的人来说才是可写的。这也意味着仅仅能控制每个目录下文件的存取,无法对单个的文件施加权限的控制。
权限策略 针对项目建立用户组,对该用户组授权. 模块的顶级目录和下面的可由项目组的所有的人读写的子目录的mode设成770或者2770,而对于某些属主可读写,同组可读的,设成750或者2750. 注意:在这种情况下,须改一下config文件,改成不在当前模块目录下生成锁文件,把锁文件集中到一个所有用户都有读写权限的目录。 LockDir=/var/lock/cvs
CVS的使用 • 建立模块 在逻辑上把一组目录、文件组成一个项目,用一个模块来定义它。 模块能容易地把相关的目录和文件关联起来 可以在CVSROOT下的modules中定义。最简单的方式 mname [ options ] dir [ files... ] mname模块名 dir:模块相对于$CVSROOT的路径 通过导入模块操作来创建模块.先建立文件夹,然后设置属主,用户 组,mod等,然后导入操作,对于个别的文件夹设置mod. 模块是相对的,模块中可以有子模块.模块的定义不是严格需要的,在 checkout时将任何一级的目录视为模块不会出问题的。
什么是标签(tag) 对于大多数CVS用户来说,不需要考虑版本的修订号,他们只要知道CVS已经自动地加上了类似1.1, 1.2之类的修订号就可以了。如果用户想跟踪许多文件的一系列版本号,例如一个特别的发布版本,使用了一个特殊的标签(tag)作为修订号,这个符号标记的功能和每个文件的数值修订号的功能是相同的。 Tag:符号形式的修订号.可以对一个文件,多个文件,模块或者子模块使用.标签名称必须以大写或者小写字母开始,可以包括大写和小写字母,数字,-,和_。
什么是分支(branch) • CVS允许修改代码到不同的开发线上,这就是分支(branch)。当改变一个分支中的文件时,这些更改不会出现在开发主干(main trunk)和其它分支中。 • 在这之后你可以使用合并(merging)把这些变更从一个分支移动到另一个分支(或主开发主干)
分支适用的情况 • 假定tc.c发行版1.0已完成。正在继续开发tc.c,计划在2个月后发行1.1的版本。不久客户开始抱怨说代码有些问题,检出了1.0的发行版,找到了这个错误(这将会有一个小小的更正)。但是,当前代码的版本是处在一个不稳的状态,并且在下一个月才能有希望稳定下来。这样就没法基于最新代码去发行一个修复错误的版本。 • 这种情况下就可以去创建一个分支(branch),分支所有文件是构建于tc的1.0发行版。可以修改这分支而不影响到主干。当修订完成时,你可以选定是否要把它同主干合并或继续保留在这个分支里。
wincvs的使用 点击系统_ 配置
wincvs的使用 • 登陆
更新文件或者模块 与当前版本合并。
增加文件 1对于目录不存在,先增加目录。点击“修改”-“添加选择的文件”,将目录加入。 2目录存在,选中要添加的文件。三种方式:添加,二进制添加,unicode添加。 此时文件还没真正入库。 3.提交修改。
查看文件状态 • 选择文件,右键“标记状态” cvs status -v rdmis.jpx (in directory E:\cvsfiles\rdmis\开发库\源代码\) =================================================================== File: rdmis.jpx Status: Locally Modified Working revision: 1.5 Repository revision: 1.5 /var/cvsroot/rdmis/开发库/源代码/rdmis.jpx,v Sticky Tag: (none) Sticky Date: (none) Sticky Options: (none) Existing Tags: vdfdf (revision: 1.5) version12 (branch: 1.1.2) version10 (revision: 1.1) ***** CVS exited normally with code 0 *****
文件版本历史 • 右键选择版本历史
查看文件日志信息 • 选择文件,右键“标记状态” • Working file : 'rdmis.jpx' • Head revision : 1.5 • Branch revision : • Locks : strict • Access : • Symbolic names : • 1.5 : 'vdfdf' • 1.1.0.2 : 'version12' • 1.1 : 'version10' • Keyword substitution : 'kv' • Total revisions : 5 • Selected revisions : 5 • Description :
查看文件日志信息 Revision : 1.5 Date : 2004/7/9 4:47:8 Author : 'tiger' State : 'Exp' Lines : +14 -12 Description : JBuilder Project file update ---------------------------- Revision : 1.4 Date : 2004/7/1 3:24:8 Author : 'tiger' State : 'Exp' Lines : +2 -25 Description : JBuilder Project file update
文件比较 • 现有文件与服务器上文件的比较 • 与某一分支、版本的比较 • 指定的两个分支、版本件间的比较。
56c67 • < prompt=kaoQin.getRDKaoQinMonthReportPrompt(startDate,endDate); • --- • > prompt=kaoQin.getRDKaoQinMonthReportPrompt(startDate,endDate,isKaoQinManager); • 145c156 • < <TD class=a1 align=middle colSpan=11 eight=20> • --- • > <TD class=a1 align=middle colSpan=14 eight=20>
wincvs的使用 • 文件删除 选择文件,单击“修改”下的“删除选择的文件”,将本地的文件删除,并标记为删除状态。然后选择“修改”下的“移除”,将服务器上的文件删除。本地显示删除状态。单击添加会恢复回来。
配置管理 配置管理标识在给定时间点上的软件配置,系统的控制对配置的更改,并且维护在整个软件生命周期中配置的完整性和可跟踪性。它使软件过程的可视化变得具体。
配置管理的目标 1. 软件配置管理的活动是有计划的。 2. 所选择的软件工作产品是经过标识、受到控制并具有可用性的。 3. 所标识工作产品的变更要受到控制。 4. 软件基线的状态和内容要通知到受影响的组和个人
基本术语 • 配置标识 • 版本控制 • 基线
配置标识 为产品的结构,产品的构件及其类型分配唯一的标识符,并以某种形式提供对它们的存取
版本控制 通过建立产品基线,控制软件产品的发布和在整个软件生命周期中对软件产品的修改,如它将解决哪些修改会在该产品的最新版本中实现的问题
基线(Baseline) • 定义:在配置管理系统中,基线就是一个CI或一组CIs在其生命周期的不同时间点上通过正式评审而进入正式受控的一种状态,而这个过程被称为“基线化”。基线是被评审过的一个或多个软件配置项。 • 每一个基线都是其下一步开发的出发点和参考点。基线确定了元素(配置项)的一个版本,且只确定一个版本。一般情况下,基线一般在指定的里程碑处创建,并与项目中的里程碑保持同步。
基线(Baseline) • 属性:通过正式的评审过程建立基线存在于基线库中,对基线的变更接受更高权限的控制基线是进一步开发和修改的基准和出发点进入基线前,不对变化进行管理或者较少管理进入基线后,对变化进行有效管理,而且这个基线作为后继续工作的基础不会变化的东西不要纳入基线变化对其他没有影响的可以不纳入基线
基线(Baseline) • 作用: 定义产品的阶段成果 定义问题出现原因 统计变化,比较各个版本
各种基线 • 计划基线 • 需求基线 • 编码基线 • 测试基线 • 产品基线
配置管理的基本流程 • 制定配置管理计划 • 建立开发库,基线库,产品库 • 标识软件工作产品 • 基线审批 • 变更控制 • 状态报告