1. 安装服务器
在unix/linux平台上安装CVS服务器
安装是超级用户执行的。假设选择一台Linux服务器,假设主机名为hostcvs
进入目录cvs-1.11.1p1,运行:
[root@hostcvs /root]$ ./configure
[root@hostcvs /root]$ make
root@hostcvs /root]$ make install
查询是否安装服务器
whereis cvs 查询是否安装cvs
下列操作均在服务器上进行
cvs仓库(Repository)是保存软件资源的设备,可以根据需要选择一目录作为库的位置,如,/cvsap ,用超级用户建相应目录。
mkdir /cvssrc
mkdir /cvssrc/master (建立目录root/cvssrc/master)
2. CVS服务器的初始化
在确定CVS仓库位置后,就可以初始化CVS服务器。在初始化的过程中CVS创建其文件系统,并产生原始内容
[root@hostcvs /root]$ cvs –d /cvssrc/master init 。
执行命令:
[root@hostcvs /root]$ ls /cvssrc/master
结果: CVSROOT
3. 添加用户组
添加cvsadmin用户组
2)添加cvsuser用户组
3)添加CVS管理员帐号到cvsadmin
4) 添加CVS普通用户到cvsuser
5) 让cvs管理员拥有对配置目录及其下文件的读写权限,同时给cvs的普通用户对配置目录及其下文件的读权限。
[root@cvshost /root]$ chgrp –R cvsadmin /cvsap/src/master/CVSROOT
[root@cvshost /root] $ chmod –R 064 /cvsap/src/master/CVSROOT
6) 给cvs普通用户对目录/cvsap/src/master/project的读写权限
[root@cvshost /root] $chgrp –R cvsuser /cvsap/src/master/project
[root@cvshost /root] $ chmod –R 060 /cvsap/src/master/project
rwx|rwx|rwx
每一个用户都有它自身的读、写和执行权限。第一套权限控制访问自己的文件权限,即所有者权限。第二套权限控制用户组访问其中一个用户的文件的权限。第三套权限控制其他所有用户访问一个用户的文件的权限
drwxr-xr-x 2 root root 48 8月 12 22:25 MyMusic
d:表示是一个目录,事实上在ext2fs中,目录是一个特殊的文件
以下操作均在客户端上进行
以下命令均在客户端运行
import命令
从客户端登陆服务器。在客户端有目录,如,test,其中有源文件和子目录,将目录test下的内容加入服务器作为一个项目(如,project,test),即一个baseline。命令为:
your_client$ cvs import –m “initial import” test SSE start
该命令将当前目录(包含子目录)下的所有内容,都放进CVS系统中,其中,
-m 表示在命令中要加注释内容
test 为该项目名称
SSE 为厂商标识
start 为版本标记
checkout命令
checkout命令是将我们选定的CVS服务器上指定仓库中的一个项目代码取到本地的工作目录下。
如果要将仓库中的test项目的代码取到本地个人目录下,执行:
your_client$ cd $HOME
your_client$ cvs checkout test
diff命令
CVS能将你工作的拷贝中的源代码文件与仓库中的版本进行比较,发现差异。(45页)如:
your_client$ cvs diff test.c
your_client$ cvs diff –c test.c
该命令能看到对照的结果。应该注意的是显示内容中的“+”表示添加行,“!”表示修改,其余的显示内容和UNIX系统中的diff命令显示相仿。
your_client$ cvs diff –r 1.1 –r 1. 2test.c
该命令比较库中两个不同版本文件差异
commit命令
提交操作会改变仓库内容。提交之后,代码成为整个 系统的一个部分了。由于软件的复杂性,需要对提交进行控制。所以在提交时应当遵循一定的流程,进行一定的软件质量保证(SQA)工作,这些工作包括评审(review)、提交报告等。
提交源代码的命令为:
your_client$ cvs commit –m “add string variable and header string.h” test.c
注意:如果提交失败,此时应该用update命令更新个人工作目录下的源代码。
update命令
该命令既可针对单个文件,也可针对一个目录,或者整个项目.
更新单个文件
your_client$ cvs update test.c
执行上述命令后,用户当前工作目录中的文件test.c的内容与仓库中的最新版本完全相同了,因为在你checkout该文件后,在修改该文件的过程中可能他人已经修改并提交了该文件,即你的修改不是基于库中最新版本。所以,你必须先update,再提交该文件才能提交成功。不过可能有冲突要解决,原因是对同一个文件的同一处代码进行了不同的修改。解决冲突的办法就是通过编辑文件,修改发生冲突的部分。对于逻辑问题CVS无法发现,所以版本冲突的处理应该与软件开发中的需要相结合。另外,可以通过more命令看以下合并后的文件,如,more test.c
更新整个项目
your_client$ cvs update
执行上述命令后,用户当前工作拷贝中属于本项目的所有文件与仓库中的最新版本完全相同了
log命令
每次提交一个CVS操作时,必须填写日志信息,否则拒绝提交。日志信息可以在命令行中加“-m”参数表示。如果日志过长,可以不用“-m”参数而直接运行,CVS会弹出一个编辑器,让用户在编辑器中输入注释信息。CVS对注释信息没有长度限制。这种日志信息是CVS进行软件变化跟踪的一种机制。
每个版本均有日志信息。用户可以查看某个文件的全部历史日志记录,也可以指定查看某个版本或某个日期的日志记录。查看日志信息使用命令:cvs log(53页) 。
查看文件test.c全部日志,使用命令:
your_client$ cvs log test.c
查看test.c文件1.2版本的日志,使用命令:
your_client$ cvs log –r1.2 test.c
再如:cvs log –d“2002-06-01<2002-07-01;2002-08-01<2002-09-01”
status 命令
该命令是查看已经checkout出来的文件信息,如 :
your_client$ cvs status test.c
your_client$ cvs status –v test.c(同时能查看tag 和branch)
your_client$ cvs status –v (查看所有文件的tag和branch)
版本回退
如果用户提交了一个错误的版本,而不希望错误的版本是当前最新版本,一个简单的方法就是回退。
用命令:命令假设,错误版本号为1.3,正确版本号为1.2
your_client$ cvs update –j 1.3 –j 1.2 test.c
将1.3版本与1.2版本之间的差异补到1.3版本上去
your_client$ cvs status test.c
查看checkout出的1.3版本的状态(已经在本地修改)
your_client$ cvs commit –m “reverted to revision 1.2” test.c
your_client$ cvs diff –r 1.2 –r 1.3 test.c
add命令
将工作目录中新加的目录和文件添加到cvs库中的方法:
在工作目录中创建目录和文件后才能进行。
添加文件需两步:
加文件的第一步:
your_client$ cvs add newfile
执行第二步:
your_client$ cvs commit –m “added” newfile
添加文件夹只需一步 (不管目录是否为空目录)
your_client$ cvs add newdir
注意:但是目录中的文件需要分别加入
remove命令
删除文件
your_client$ cvs remove –f oldfile
your_client$ cvs commit –m “removed” oldfile
删除文件夹
因为cvs不对目录进行版本控制,所以和删除文件不同,没有一个专门的命令。例如(要删除目录olddir):
your_client$ ls -a
olddir test.c test1.c test.pc
your_client$ cd olddir
your_client$ ls –a
tmp.c tmp1.c
以下是删除目录olddir的命令:
your_client$ cvs remove –f tmp.c tmp1.c
Your_client$cvs commit –m “removed” tmp.c tmp1.c
your_client$ cd ..
your_client$ cvs update –P (更新, -P 告知 cvs update将空目录由库存中删除)
your_client$ cvs update(所有空目录均从工作目录中删除)
这时目录olddir从工作目录中消失(注意前提是将olddir中的文件全部删除)
注意:此命令不会将库中新添加的目录取到工作目录中,可执行命令:your_client$ cvs update -d
高级主题
版本标签(tag)
版本标签是符号化的版本号码,具有直观、易于记忆和管理的优点。用于阶段式(里程碑)的版本标记。是连接项目中不同文件不同版本的手段。
标签的设定
[Du_cloud@linux test]$ cvs tag rel_1_0_1 test.c
给test.c打上标签rel_1_0_1
注意:很少给单个文件设标签。
给目录下所有文件贴标签:(选中目录)
[Du_cloud@linux test]$ cvs tag baseline_1
删除:
[Du_cloud@linux test]$ cvs tag –d baseline_1
重命名:
[Du_cloud@linux test]$ cvs tag –r baseline_1 baseline_2
(先重命名再进行删除原标签)
[Du_cloud@linux test]$ cvs tag –d baseline_1
移动:
[Du_cloud@linux test]$ cvs tag –r 1.6 –F baseline_1 test.c
这里我们将test.c的标签从旧版本1.5移到新版本1.6上。
给 cvs tag 加上 `-c' 选项。如果有任何本地修改过了的文件,cvs 在其打标签之前将给出错误信息而退出:
$ cvs tag -c rel-0-4
cvs tag: backend.c is locally modified
cvs [tag aborted]: correct the above errors first!
按约定贴标签(仓库中直接给模块加标签)
按日期贴标签(下例是将模块test的所有文件在20030624号0时0分前提交的最后一个版本贴上标签:
[Du_cloud@linux test]$ cvs rtag –D 20030624 nightly_20030624 test
按版本号、已经有的标签贴新标签
[Du_cloud@linux test]$ cvs rtag –r old_20030624 new_rel_2_1 test(贴新标签但test下新加程序不挂到标签上)
[Du_cloud@linux test]$ cvs rtag –f nightly_20030624 test(将test下新加的程序的最新版本强制的挂到nightly_20030624上)
注意:cvs rtag –f 只和cvs rtag –r 或 cvs rtag –D 配合使用
[Du_cloud@linux test]$ cvs rtag –r 1.5 rel_2_1 test
[Du_cloud@linux test]$ cvs rtag –f 1.5 rel_2_1 test
附着性标签(sticky tags)
1)引起附着性标签的命令有:
cvs update –r tag
cvs update –D date(更新到不晚于date的最新版本)
cvs update –r x.y
cvs checkout –r tag
cvs checkout –D date (date之前最近的版本)
cvs checkout –r x.y
这种附着性标签主要用在:
1)版本分支:版本分支标签在创建分支的时候与版本分支关联在一起,并且在解除之前一直有效。
2)保持某几个文件不改动:有时候可能需要保持某几个文件目前版本一段时间,可以用cvs update –r,命令为文件建立附着性标签,以后在这个目录下执行cvs update命令,该文件都不会被修改。
例子:
只要对几个文件执行了cvs update –r 命令,如:cvs update –r 1.28 ax.c则版本1.28就会成为附着性标签,以后执行cvs update 命令时这个文件不会更新,直到解除附着性为止。
类似的,如果开发者希望检出某个日期时间点上的版本,而不希望后来执行cvs update的时候,这几个文件被更新,就可以用cvs checkout –D 或者cvs update –D 来达到将该日期与该版本关联的目的。
解除附着性标签:
[Du_cloud@linux test]$ cvs update –A test.c
该命令解除附着性标签,将checkout主干的最新版本并放本地
如何获得某个特定的版本
§ 根据版本号码或版本标签获得
[Du_cloud@linux test]$ cvs update –r 1.1 test.c
获得某一版本标签的整个软件的源代码:
[Du_cloud@linux test]$ cvs checkout –r baseline_1 test
或者跳转到某个版本标签的版本(已经有工作拷贝的情况下)
[Du_cloud@linux test]$ cvs update –r baseline_1
§ 根据时间获得特定版本(更新到不晚于date的最新版本)
[Du_cloud@linux test]$ cvs update –D “2002-05-08”
版本分支
[Du_cloud@linux test]$ cvs co –d test_new –r base_1 test
将标签base_1 下的文件checkout到 新建目录 test_new下
[Du_cloud@linux test_new]$ cvs tag –b New_Branch,
在标签base_1下建立分支New_Branch
[Du_cloud@linux test_new]$ cvs up –r New_Branch,(可以在分支中修改程序如:test.c) (进入分支New_Branch,进入之后可以在分支上修改文件) 1.1.2 变成1.1.2.1
[Du_cloud@linux test_new]$ cvs ci –m “fixed bug no 111” test.c(提交到分支上)
[Du_cloud@linux test]$ cvs up –j base_1_brh(分支版本合并到主干版本中)
[Du_cloud@linux test]$ cvs ci –m “merged from branch:base_1_brh”
发布代码
cvs export –r rel_1_0_1 –d test_release1(新建文件夹) test(发布的文件所在目录) (选定文件夹以作为新建文件夹的父目录
关于二进制文件的入库
§ CVS在处理文本类型的文件,包括各种源代码文件、HTML、XML文件等。CVS对文本类型的文件进行版本管理时,会对文件做一些秘密的处理,在客户端和UNIX仓库之间,CVS会自动进行回车、换行替换和关键字扩展处理。
§ CVS对二进制文件的管理和保存:
1)在CVS系统中保存二进制文件,应该使用“-kb”选项来禁止CVS对文件进行回车、换行替换和关键字扩展的加工。这个选项只需要在cvs add 命令中使用,本选项是一个附着性选项(如果没有附着性每次执行cvs命令时都需要这个选项)。
如:cvs add –kb binfile
cvs commit –m “added binfile” binfile
注意:二进制文件是原封不动的保存在仓库中,不能按照增量方式保存两个版本的差异,而是累加。