Duangw

cvs

索引:

  1. 权限设定
  2. 配置cvs口令服务器
  3. 初始化服务器
  4. 使用基础
  5. 常用命令缩写
  6. 标签的管理
  7. 版本分支
  8. cvs输出export
  9. 清除工作拷贝
  10. 日志管理
  11. 关键字扩展
  12. 模块配置
  13. 二进制文件配置
  14. 触发器文件
  15. 其他配置文件

1.权限设定

(1).设定规则

cvs用户必须拥有对$CVSROOT/CVSROOT目录及其中所有文件的读权限。

cvs用户必须拥有对$CVSROOT/CVSROOT目录下history文件的写权限。

cvs用户如果希望拥有修改某个项目(模板)代码等资料的权利,必须拥有对该目录的写权限。

cvs系统的权限控制依赖于操作系统,可利用操作系统本身的权限设置来控制cvs的权限。

(2).口令文件

pserver认证方式以明文在网络上传输cvs密码。使用口令文件允许cvs用户使用与系统帐号密码不同的密码。

口令文件在服务器的$CVSROOT/CVSROOT/passwd文件。格式为:

cvsuser:[passwd][:sysuser]

口令passwd从/etc/passwd或/etc/shadow获得。

口令文件的安全性很重要,应该将该文件的读写权限仅限于root。

如:

anonymous:
ken:aWTrltv4Ae:pubcvs
(3).设定只读用户

在$CVSROOT/CVSROOT/readers文件里,每行记录一个cvs用户名。

(4).设定具有写权限的用户

在$CVSROOT/CVSROOT/writers文件里,每行记录一个cvs用户名。

同时在readers和writers里的用户只拥有读权限。

 

2.配置cvs口令服务器

(1).inet服务器

文件/etc/services:

cvspserver 2401/tcp

文件/etc/inet.conf:

cvspserver stream tcp nowait root /usr/local/bin/cvs cvs -f \
	--allow-root=$CVSROOT pserver
(2).xinet服务器

编辑cvspserver文件:

service cvspserver
{
  port = 2401
  socket_type = stream
  wait = no
  user = root
  server = /usr/bin/cvs
  server_args = -f --allow-root=$CVSROOT pserver
}
(3).客户端配置

设置环境变量CVSROOT:

CVSROOT=:pserver:username@hostname(ip):[port]path

如:

:pserver:cvsadm@10.10.16.177:2402/home/cvsroot
:pserver:cvsadm@10.10.16.177:/home/cvsroot
(4).客户登录/注销
cvs login
cvs logout

 

3.初始化服务器

如果设置了环境变量CVSROOT,则执行:

cvs init

否则,执行:

cvs -d path init

其中path等于$CVSROOT。

 

4.使用基础

(1).创建新项目(模板)

进入项目所在目录:

cvs [ -d $CVSROOT] import [-m log] name VENDOR START

VENDOR表示开发者的标识,START表示起始版本标签。

如:

cd eSWITCH
cvs import eSWITCH v s
(2).捡出工作拷贝
cvs checkout [ -d dir ] module

局部选项-d表示将拷贝放到目录dir下,而不是在一个与module名一样的目录下。

cvs使用文件的时间戳,所以保持服务器和客户端的时钟同步是很重要的。

(3).比较仓库和拷贝的区别
cvs diff filename
cvs diff -c filename(使用对照方式)
(4).提交工作拷贝
cvs commit [-m log] [filename]

当一次提交多个文件时,这些文件共享同一个日志信息。

(5).更新工作拷贝
cvs update [ filename ]
(6).查看日志信息
cvs log filename
(7).版本回退

方法一:取出旧版本,重新提交。如:

cvs update
cvs up -p -r1.2 test.c >test.c
cvs ci test.c

方法二:使用join(合并)选项。如:

cvs up -j 1.3 -j 1.2 test.c
cvs ci test.c

把1.3版本与1.2b版本之间的差异补到当前1.3版本上,相当于从1.3版本上将1.2到1.3之间的变化又减去了。

(8).添加目录或文件

创建一个目录或文件后,执行:

cvs add newfile

对于文件,还要做提交:

cvs ci newfile
(9).删除文件
rm newfile
cvs remove newfile

或:

cvs remove -f newfile

最后,进行提交:

cvs ci newfile
(10).删除目录

首先删除该目录下所有文件,然后使用update的-P选项删除目录:

cd newdir
cvs remove -f new.c
cd ...
cvs update -P

执行cvs update时,cvs并不会自动取出在工作拷贝创建之后新添加到仓库的目录。解决方法是使用update的-d选项:

cvs update -d
(11).重命名文件

方法一,先从cvs中删除旧文件,再添加新文件:

mv old new
cvs remove -f old
cvs ci old
cvs add new
cvs ci new

方法二,直接修改服务器上的文件,要确保没有人访问这个文件,否则将引起不可预知的后果:

cd $CVSROOT/module
mv old,v new,v
(12).重命名目录

方法一,创建新目录,将旧目录下的文件移到新目录下,删除旧文件,添加新目录,添加新文件:

mkdir newdir
mv olddir/* newdir
cvs remove olddir/*
cvs ci
cvs add newdir
cvs ci newdir

方法二,直接再cvs服务器仓库中移动目录:

cd $CVSROOT/module
mv olddir newdir

 

5.常用命令缩写

cvs checkout:cvs co;

cvs commit:cvs ci;

cvs update:cvs up;

cvs status:cvs st;

 

6.标签的管理

(1).创建标签
cvs tag tagname
(2).标签命名

以字母开头,中间可以含字母、数字、下划线、连字符。

(3).删除标签
cvs tag -d tagname
(4).重命名标签

先贴上新标签,再删除旧标签:

cvs tag -r tag1 tag2
cvs tag -d tag1
(5).修改某个文件的标签指到别的版本
cvs tag -r new-version -F tag1 filename

如:

cvs tag -r 1.6 -F tag1 test.c
(6).查看标签
cvs status -v filename
(7).特定约束标签

按照日期贴标签:

cvs rtag -D date tagname module

按照已经版本/标签贴标签:

cvs rtag -r revision/tag newtag module
(8).获取某个特定版本
cvs update -r revison/tag module
cvs update -D date module
(9).恢复到最新版本
cvs update -A

 

7.版本分支

(1).分支版本号

在x.y版本上的分支编号依次是x.y.2、x.y.4、x.y.6等等。

(2).在工作拷贝中创建分支

取出某一版本的代码:

cvs checkout -r tag module

创建:

cvs tag -b branch-tag module
(3).直接在仓库中创建分支
cvs rtag -b -r tag branch-tag module
(4).访问版本分支

方法一、捡出:

cvs checkout -r branch-tag module

方法二、版本切换:

cvs update -r branch-tag
(5).将分支合并到主干

在主干目录下,执行:

cvs update -j branch-tag [ filename ]

每次合并都会把从分支基部到分支最新版本之间的全部修改都合并到主干中。

可以指定合并的版本范围。如:

cvs up -j 1.1.1.1.6.1 -j rel-20021010-brach test.c

把分支rel-20021010-brach从1.1.1.1.6.1到最新版本之间的修改合并到主干上。

进行多次反复合并的一个技巧是在每次合并之后,将分支再贴上标签,这样,每次合并时的分支版本都有标签可以标识。

(6).将主干合并到分支

在分支目录下,执行:

cvs update -j HEAD

其中HEAD是关键字,表示主干代码树的头部,也就是全部最新的主干代码版本。

 

8.cvs输出export

取出一份没有cvs痕迹的源代码:

cvs exprot -r tag [ -d dir ] module

 

9.清除工作拷贝

cvs release -d module

 

10.日志管理

(1).查看详细修改记录
cvs annotate [ -r revision/tag | -D date ] [ filename ]
(2).查看历史记录
cvs history
(3).修改日志信息
cvs admin -m revsion: “messages” filename

对于共享日志,需要对每个文件单独执行上述操作。

 

11.关键字扩展

cvs中的关键字用两个“$”符号,中间是一个rcs的特定关键字。常用列表如下:

$Revision$

自动扩展为版本号。

$Log$

累计日志信息。

每次更新都进行累加,如果太长,可以手工删除旧的注释。

$Author$

扩展为提交版本的用户的用户名。

$Date$

上一次提交的日期、时间。

$Id$

扩展为文件名、版本号、日期、作者、状态,如果被锁定,还有锁定者的用户名。

$Source$

扩展为带有完整路径的源代码文件名。

 

12.模块配置

(1).定义模块步骤

修改模块文件需要先checkout:

cvs checkout CVSROOT/modules

修改完毕提交:

cvs ci CVSROOT/modules
(2).语法
module-name [ options ] dir [ files …]
(3).使用举例

由project/acctmgmt组成的模块:

acctmgmt  project/acctmgmt

有目录下的三个文件组成的模块:

acctmgmt  prject/acctmgmt readme install license

不包含指定目录下的子目录doc:

acctmgmt  !project/acctmgmt/doc project/acctmgmt

定义别名(有三个模块组成):

acctmgmt -a init mm file

引用:

lk & linux_kernle
(4).模块选项

-d name:让工作拷贝的名字为参数值而不是模块名;

-e prog:文件被输出(exprot)时执行的程序;

-i prog:提交模块时执行的程序;

-o prog:捡出模块时执行的程序;

-s status:给模块定义一个状态;

 

13.二进制文件配置

在cvs中保存二进制文件,要使用“-kb”选项来禁止cvs对文件进行加工。该选项只需要在cvs add时使用。“-kb”是一个Sticky Option。

(1).cvswrappers

通过配置$CVSROOT/CVSROOT/cvswrappers文件,使cvs根据文件扩展名来区别二进制文件。

(2).修改方法

同modules的方式。

(3).语法
wildcard [ option val ] [ option val ] …
(4).选项

-m MERGE|COPY:更新方式,MERGE表示更新时进行版本间差异的合并,COPY表示直接拷贝,不进行合并处理。

-k ‘b’|’o’|’kkv’:关键字扩展,’b’表示二进制;’o’表示“off”,不进行关键字扩展,但它仍进行不同平台之间的回车、换行转换;’kkv’表示扩展关键字的值。

(5).使用举例
*.gif -k ‘b’
*.jpg -k ‘b’
*.doc -k ‘b’
*.bmp -k ‘b’
*.mpp -k ‘b’
*.xls -k ‘b’
*.ppt -k ‘b’

 

14.触发器文件

(1).commitinfo

定义每次提交发生时执行的程序。被提交的文件名作为程序的参数。

(2).loginfo

定义在提交操作完成之前被触发的程序,用户提交时写的日志信息传送到程序的标准输入。

(3).verifymsg

提交时,日志信息送到定义的程序的标准输入,程序返回0则进行提交,返回非0则提交被终止。

(4).rcsinfo

定义日志文件的模板文件。

(5).taginfo

定义贴标签时执行的操作,标签字符串、标签操作、仓库、文件版本作为参数传递给程序。

 

15.其他配置文件

(1).checkoutlist

指定自定义的配置文件,使其置于cvs的版本管理之下。

(2).cvsignore

指定被cvs忽略的文件类别。

缺省忽略的文件类型如下:

RCS SCCS CVS CVS.adm
RCSLOG cvslog.*
Tags TAGS
.make.state .nse_depinfo
*~ #* .#* ,* _$* *.$
*.old *.bak *.BAK *.orig *.rej *.del-*
*.a *.olb *.o *.obj *.so *.exe
*.Z *.elc *.ln
core