环境变量CVSROOT决定了CVS的基本配置,包括验证方式,用户名,cvs服务器ip,cvs服务器商品以及仓库名称。
- pserver: 目前的cvs服务器的验证方式是使用pserver密码验证。
- username: 需要预先获得用户名,不同仓库都需要用户名。
- cooling.ape-tech.com: 目前cvs服务器域名。
- 2401: cvs服务器端口名。
- ImRoBot5: cvs仓库名,上一版位于ImRoBot4。
$ export CVSROOT=:pserver:username@cooling.ape-tech.com:2401/ImRoBot5$ cvs loginpassword:
上传项目。需要注意的是,import一个项目后,用户还需要把项目checkout下来,才可以对其进行修改。
$ mv project project.backup //项目名称不一定要和当前目录同名,之所以取名为project.backup,是因为import后,该目录就没有用处了。如果希望修改文件,需要checkout该项目到另一目录后,才能做。$ cd project.backup //先进入需要import的项目目录。$ cvs import project r1 ape //导入,项目名不需要与当前目录同名,import成功后,这个目录就没有用处了,如果checkout后有问题,再利用这个文件夹中正确的文件做为参考。$ cd .. // 返回上级目录,准备checkout项目。$ mkdir project // 建立项目根目录。$ cd project $ cvs checkout -d project-trunk project // checkout项目主线,主线名称
取项目,简称co。一个项目只在第一次取代码的时候进行此操作,之后更新代码使用update。
// 把project中打上project-r1标签的版本取到本地,目录名为project-r1。$ cvs co -d project-r1 project-r1 head project
// 把project的主线取到本地,目录名为project-trunk。 $ cvs co -d project-trunk project
cvs co -r egg2-0-8 -d egg2-0-8 egg2
更新项目,简称up。
// 进入项目目录。 $ cd project-trunk// 更新代码。-d参数将新建出仓库中存在的目录。否则cvs是不会主去新建目录的。$ cvs up -d
// 取得特定版本的文件。 $ cvs up -r project-r1 myfile.c// 清除当前版本所属的标签。$ cvs up -A myfile.c
cvs会用一个字母表示当前目录下文件的状态。
? target //?表示本地有,服务端没有。如果是不需要上传的文件,这是正常状态。? src/Makefilecvs update: Updating .cvs update: Updating examplescvs update: Updating examples/myprojectcvs update: Updating examples/myproject/srccvs update: Updating srcM src/RD-cvs-convention.h // M表示本地文件已经修改过,同服务器上不一致,如果确认修改无误后,应当及时提交。U src/RD-code-convention.h // 本地没有这个文件,但从服务器下载完成。C src/RD-maketool-convention.h // C表示本地文件与服务器文件之间有冲突,通常这种情况发生在,两个以上的人对一个文件的同一版本进行了修改,第一个人上传没有问题,但第二个人上传即会出现该问题。P src/RD-xxx.h //
增加文件或目录。add后还需要执行commit操作,文件才会出现到服务器上。
cvs add myfile.c // 普通文件上传cvs add -kb summary.pdf // 增加二进制文件,通过word,pdf,图片都应以这种方式上传。
提交修改内容。
cvs ci myfile.c
比较本地版本与服务器版本的差别。diff结果可以参见cvs手册,但基本可以理解。
cvs diff myfile.c
cvs上只应保存代码,数据文件,配置文件,xml文档,文档需要的图片。
任何可执行程序都不应上传,word文档最好能写成docbook或doxygen的格式,便于比较。一个完整的项目import前需要通过make clean删除编译结果; make distclean删除configure生成的Makefile; 删除autom4e目录,其中的宏并不是必须的,但这些宏非常大,影响cvs性能。 为了确保import无误,导入者需要将项目重新取下,检查是否有问题,并有责任上传缺失或错误的文件。需要上传的项目文件如下:
aclocal.m4 ChangeLog config.sub configure.ac CVS INSTALL ltmain.sh Makefile.in NEWS srcAUTHORS config.guess configure COPYING depcomp install-sh Makefile.am missing README
cvs没有删除目录的命令,只有删除文件与空目录的命令。因此删除目录只能通过cvs rm结合find命令实现删文件,再结合cvs up -P删除空目录来实现。
自己总结 先在本地删除文件 然后cvs rm , cvs ci
$ find . -type f | xargs rm; cvs rm$ cvs ci$ cvs up -P
先通过cvs up确保代码是最新的,然后打标签。
$ cvs up $ cvs tag -R tag-name
冲突是所有版本控制工具不可避免的问题,要解决冲突是一件很麻烦的事情,因此最好的办法是尽量避免冲突的产生。要避免冲突,需要保持一个好的习惯,就是经常update代码,及时commit。 冲突一旦出现后,要解决冲突。可以打开发生冲突的文件。文件内容可能如下:
<<<<<<<<<< printf("hello1\n"); ================= printf("hello2\n"); >>>>>>>>>>
冲突由两部分组成,<<<<<<<与=======之间,是服务器的内容,======与>>& gt;>>>>>是本地文件的内容。解决冲突,就是要分析,到底应该取舍哪一段代码。如果取舍本地代码,则更新后的文件内 容应该如下:
printf("hello2\n");
分支名规范如下,project-0-number,number从1开始增长。如spider-0-1。
为了容纳多个分支,本地目录需要有一个项目目录project,在该目录下,每个分支都以一个独立的子目录的方式存在。如主线名称为project-trunk,0-1版本名为project-0-1。// 为当前版本建立分支,分支名为rel-1-0-patches $ cvs tag -b rel-1-0-patches// 取分支$ cd spider// 取spider中spider-0-1-patches分支到要地目录spider-0-1-patches目录$ cvs co -r spider-0-1-patches -d spider-0-1-patches spider