cvs用户必须拥有对$CVSROOT/CVSROOT目录及其中所有文件的读权限。
cvs用户必须拥有对$CVSROOT/CVSROOT目录下history文件的写权限。
cvs用户如果希望拥有修改某个项目(模板)代码等资料的权利,必须拥有对该目录的写权限。
cvs系统的权限控制依赖于操作系统,可利用操作系统本身的权限设置来控制cvs的权限。
pserver认证方式以明文在网络上传输cvs密码。使用口令文件允许cvs用户使用与系统帐号密码不同的密码。
口令文件在服务器的$CVSROOT/CVSROOT/passwd文件。格式为:
cvsuser:[passwd][:sysuser]
口令passwd从/etc/passwd或/etc/shadow获得。
口令文件的安全性很重要,应该将该文件的读写权限仅限于root。
如:
anonymous:
ken:aWTrltv4Ae:pubcvs
在$CVSROOT/CVSROOT/readers文件里,每行记录一个cvs用户名。
在$CVSROOT/CVSROOT/writers文件里,每行记录一个cvs用户名。
同时在readers和writers里的用户只拥有读权限。
文件/etc/services:
cvspserver 2401/tcp
文件/etc/inet.conf:
cvspserver stream tcp nowait root /usr/local/bin/cvs cvs -f /
--allow-root=$CVSROOT pserver
编辑cvspserver文件:
service cvspserver
{
port = 2401
socket_type = stream
wait = no
user = root
server = /usr/bin/cvs
server_args = -f --allow-root=$CVSROOT pserver
}
设置环境变量CVSROOT:
CVSROOT=:pserver:username@hostname(ip):[port]path
如:
:pserver:[email protected]:2402/home/cvsroot
:pserver:[email protected]:/home/cvsroot
cvs login
cvs logout
如果设置了环境变量CVSROOT,则执行:
cvs init
否则,执行:
cvs -d path init
其中path等于$CVSROOT。
进入项目所在目录:
cvs [ -d $CVSROOT] import [-m log] name VENDOR START
VENDOR表示开发者的标识,START表示起始版本标签。
如:
cd eSWITCH
cvs import eSWITCH v s
cvs checkout [ -d dir ] module
局部选项-d表示将拷贝放到目录dir下,而不是在一个与module名一样的目录下。
cvs使用文件的时间戳,所以保持服务器和客户端的时钟同步是很重要的。
cvs diff filename
cvs diff -c filename(使用对照方式)
cvs commit [-m log] [filename]
当一次提交多个文件时,这些文件共享同一个日志信息。
cvs update [ filename ]
cvs log filename
方法一:取出旧版本,重新提交。如:
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之间的变化又减去了。
创建一个目录或文件后,执行:
cvs add newfile
对于文件,还要做提交:
cvs ci newfile
rm newfile
cvs remove newfile
或:
cvs remove -f newfile
最后,进行提交:
cvs ci newfile
首先删除该目录下所有文件,然后使用update的-P选项删除目录:
cd newdir
cvs remove -f new.c
cd ...
cvs update -P
执行cvs update时,cvs并不会自动取出在工作拷贝创建之后新添加到仓库的目录。解决方法是使用update的-d选项:
cvs update -d
方法一,先从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
方法一,创建新目录,将旧目录下的文件移到新目录下,删除旧文件,添加新目录,添加新文件:
mkdir newdir
mv olddir/* newdir
cvs remove olddir/*
cvs ci
cvs add newdir
cvs ci newdir
方法二,直接再cvs服务器仓库中移动目录:
cd $CVSROOT/module
mv olddir newdir
cvs checkout:cvs co;
cvs commit:cvs ci;
cvs update:cvs up;
cvs status:cvs st;
cvs tag tagname
以字母开头,中间可以含字母、数字、下划线、连字符。
cvs tag -d tagname
先贴上新标签,再删除旧标签:
cvs tag -r tag1 tag2
cvs tag -d tag1
cvs tag -r new-version -F tag1 filename
如:
cvs tag -r 1.6 -F tag1 test.c
cvs status -v filename
按照日期贴标签:
cvs rtag -D date tagname module
按照已经版本/标签贴标签:
cvs rtag -r revision/tag newtag module
cvs update -r revison/tag module
cvs update -D date module
cvs update -A
在x.y版本上的分支编号依次是x.y.2、x.y.4、x.y.6等等。
取出某一版本的代码:
cvs checkout -r tag module
创建:
cvs tag -b branch-tag module
cvs rtag -b -r tag branch-tag module
方法一、捡出:
cvs checkout -r branch-tag module
方法二、版本切换:
cvs update -r branch-tag
在主干目录下,执行:
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到最新版本之间的修改合并到主干上。
进行多次反复合并的一个技巧是在每次合并之后,将分支再贴上标签,这样,每次合并时的分支版本都有标签可以标识。
在分支目录下,执行:
cvs update -j HEAD
其中HEAD是关键字,表示主干代码树的头部,也就是全部最新的主干代码版本。
取出一份没有cvs痕迹的源代码:
cvs exprot -r tag [ -d dir ] module
cvs release -d module
cvs annotate [ -r revision/tag | -D date ] [ filename ]
cvs history
cvs admin -m revsion: “messages” filename
对于共享日志,需要对每个文件单独执行上述操作。
cvs中的关键字用两个“$”符号,中间是一个rcs的特定关键字。常用列表如下:
自动扩展为版本号。
累计日志信息。
每次更新都进行累加,如果太长,可以手工删除旧的注释。
扩展为提交版本的用户的用户名。
上一次提交的日期、时间。
扩展为文件名、版本号、日期、作者、状态,如果被锁定,还有锁定者的用户名。
扩展为带有完整路径的源代码文件名。
修改模块文件需要先checkout:
cvs checkout CVSROOT/modules
修改完毕提交:
cvs ci CVSROOT/modules
module-name [ options ] dir [ files …]
由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
-d name:让工作拷贝的名字为参数值而不是模块名;
-e prog:文件被输出(exprot)时执行的程序;
-i prog:提交模块时执行的程序;
-o prog:捡出模块时执行的程序;
-s status:给模块定义一个状态;
在cvs中保存二进制文件,要使用“-kb”选项来禁止cvs对文件进行加工。该选项只需要在cvs add时使用。“-kb”是一个Sticky Option。
通过配置$CVSROOT/CVSROOT/cvswrappers文件,使cvs根据文件扩展名来区别二进制文件。
同modules的方式。
wildcard [ option val ] [ option val ] …
-m MERGE|COPY:更新方式,MERGE表示更新时进行版本间差异的合并,COPY表示直接拷贝,不进行合并处理。
-k ‘b’|’o’|’kkv’:关键字扩展,’b’表示二进制;’o’表示“off”,不进行关键字扩展,但它仍进行不同平台之间的回车、换行转换;’kkv’表示扩展关键字的值。
*.gif -k ‘b’
*.jpg -k ‘b’
*.doc -k ‘b’
*.bmp -k ‘b’
*.mpp -k ‘b’
*.xls -k ‘b’
*.ppt -k ‘b’
定义每次提交发生时执行的程序。被提交的文件名作为程序的参数。
定义在提交操作完成之前被触发的程序,用户提交时写的日志信息传送到程序的标准输入。
提交时,日志信息送到定义的程序的标准输入,程序返回0则进行提交,返回非0则提交被终止。
定义日志文件的模板文件。
定义贴标签时执行的操作,标签字符串、标签操作、仓库、文件版本作为参数传递给程序。
指定自定义的配置文件,使其置于cvs的版本管理之下。
指定被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