一、CVS(Concurrent Version System)简介(不知道是哪个版本???)
1、CVS机制
CVS是RCS的前端工具,它是用于多用户并行开发的版本控制工具,它的最大特点 是使用了"copy-modify-merge"机制而不是"lock-modify-unlock"。通过使用 CVS生成一个存储文件的仓库(repository),存储在仓库中的每个目录叫做模块 (module),在修改时将相应的模块检出到工作目录中(working directory)生成对应的目录,所有的修改都在工作目录中完成,修改完成后再提交到仓库中生成新的版本号,并加以保存。
CVS把文件保存在一个名叫仓库(repository)的地方,仓库中保存的文件并不是每个版本的副本,
而是可以从任意版本回溯到初始版本的一些代码的主控信息,这样,就节省了大量的存储空间
风靡全球的LINUX操作系统就是在大型分布式CVS系统上开发成功的。
全球最著名的软件工程软件提供商Rational Sofdtware的ClearCase是CVS的替代产品,比CVS稍有增强
2、CVS的版本编号
分为系统编号和用户编号
系统编号是CVS自动给版本编的号码。CVS自动管理系统编号。单分支版本演化以1.0->1.1->1.2-...的方式顺序进行。
用户编号是用户为了自己控制版本号码,或者统一版本号码,而对某一版本指定的编号。
二、CVS建议开发流程
为避免其他人更新时导致无法编译的错误,建议先在开发环境中开发,编译通过后在没有大的改动情况下放入CVS中进行管理,然后发布到测试及生产环境。
以总公司网站开发为例,流程如下:
开发环境(192.168.16.33) -> CVS(192.168.16.38) -> 生产环境(192.168.16.34)
三、WinCvs的使用
1、如何设置本地工作目录
admin -> preference -> WinCvs -> HOME folder
2、如何列出CVS服务器上的modules?
admin -> Macros admin -> Get the cvs modules
CVSROOT 模块下的文件modules控制着modules的显示,由系统管理员管理。
3、如何将CVS服务器上的modules取到本地工作目录?
选中待取module -> Create -> Checkout modules... -> 输入modules名 ->确定。(偶自己的版本:Remote—checkout module--….)
4、如何将新增的程序或文档纳入CVS管理?
将新增的程序或文档copy到CVS本地工作目录 -> 右键 -> Add selection 或 Add selection binary(由文档类型决定) -> Commit selection (建议文件修改后,在commit时加上本次修改的简短描述,便于以后在log中查看历史记录。)
5、如何修改已存在程序或文档?
右键 -> Edit selection -> 修改完毕 -> Commit selection
6、如何放弃修改?
只要还未commit,右键 -> Unedit selection
7、如何将新创建的Module放入cvs服务器中?
1)将包含欲放入库中的目录copy于工作目录下
2)输入模块 Create -> Import module
3)在弹出的文件对话框中选择你要输入的工程目录的顶级目录,并确使文件夹图标打开
4)如果弹出筛选窗口,确保提交的文件被正确地设置了文本或二进制
5)点击OK按钮,wincvs然后将整个目录结构输入到CVS服务器中
8、如何更新刚创建的modules
1)在本地移走你的原始目录
2)将CVS服务器上的modules取到本地工作目录(参见上面第3步)
9、如何解决冲突?
当二人或更多人修改了同一文件时就会发生冲突,此时可打开有问题的文件,搜索以<<<<<<<开始的行。冲突区有这样的标价:
<<<<<<< 文件名
你的修改
========
从库中合并的代码
>>>>>>> 修订版
你要判断代码应该是什么,作必要的修改,删除cvs的标价,然后将你的修改提交到库中。
建议:在修改cvs中的文件时,先Update selection一下。
10、如何取回以前的版本?
Graph selection -> 右键 -> tag selection 。
11、如何在modules小窗口中看见CVS的本地工作目录?
View -> Browse Location -> 在弹出的窗口中选择本地工作目录 -> 确定
12、查看谁在修改文件
右键 -> Editors of selection。列出正在编辑files的用户。
13、如何查看文件的历史修改记录?
右键 -> Log Selection
14、什么情况下需要锁定登出(checkout)?
对于word文档、函数库等二进制文件,因无法由CVS合并,应当选中锁定登出。
右键 -> Lock Selection
Unreserved checkouts是CVS确省方式,允许其他用户修改被登出的文件
CVS不会告知第一个登入者是否还有人在修改文件。
其他人要登入会得到错误信息,他们须先与仓库中的最新版本合并才能等入。
对于源代码等,应选择非锁定登出,否则将大大降低软件生产率。
如果非锁定登出造成严重的开幕冲突,那时因为开发者的沟通严重不足。
注意:
单纯的非锁定登出对许多项目而言是可行的。
锁定登出控制过于严格,不利于提高软件生产率。
介于两者之间的非锁定登出与监视机制结合,对许多小组是最佳选择。
四、CVS补遗
1、如何删除一个目录?
需要先删除目录中的所以文件,使该目录成为一个空目录,然后运行cvs update -P让CVS从仓库中清除空目录。
2、如何重命名文件?
将工作目录中的旧文件重命名为新文件。
-mv old new
通知CVS删除旧文件
-cvs remove old
通知CVS添加新文件
-cvs add new
从CVS仓库中删除旧文件、添加新文件
-cvs ci -m "name old to new" old new
3、CVS无法完成二进制文件的版本比较和版本合并,为此,应该避免版本分支。
4、CVS无法更据文件内容识别二进制文件,但能够根据文件扩展名来识别那些文件是二进制文件,这是由cvswrappers配置文件定义的。
5、设置只读用户
向某些用户授权读取CVS仓库中的文件,但不允许他们修改文件。
在$CVSROOT/CVSROOT/readers文件中列用户名,例如:
xuys
huyj
zousj
anonymous
五、开发要点总结
1、要对cvs中的文件进行修改时,先Update selection一下,然后进行编辑。
2、对于源代码的修改,应选择非锁定登出。
3、对于word文档等二进制文件,因无法由CVS合并,应当选择锁定登出。
4、文件修改后,在commit时最好加上本次修改的简短描述,便于以后在log中查看历史记录
5、小组成员之间要加强沟通。
===============================================================================
CVS安装配置与使用指南
作者:Smilings 出处:CSDN
第1章 CVS工具的安装配置
1.1 基本安装
1.1.1 验证是否已安装CVS
#rpm -q cvs
如果能显示出类似这样的版本信息,证明已安装CVS:
#cvs-1.11.2-10
一般安装在/usr/bin/cvs,如果未安装,http://www.cvshome.org/下载一个最新的rpm安装即可。
1.1.2 CVS安装
从http://ccvs.cvshome.org/servlets/ProjectDownloadList下载最新的cvs安装包到本地后:
%gunzip cvs-1.11.2.tar.gz
%tar xvf cvs-1.11.2.tar
%cd cvs-1.11.2
%./configure (可以用./configure --help看看,根据自己的环境添加相应的参数)
%make
%su - (以正确的用户来安装)
%make install
1.2 CVS Server端的配置
安装完CVS(假设cvs安装在/usr/local/bin)后:
1.2.1 建立cvsroot用户和组(使cvsroot用户属于cvs组,用于对cvs进行管理)
root用户下执行以下命令:
#groupadd cvs
#adduser cvsroot –g cvs –d /root/cvsroot
#passwd cvsroot
#输入cvsroot用户密码
1.2.2 创建cvsroot
建立用户使用的HOME目录并将HOME目录的属性给cvsroot:
#mkdir /root/cvsroot
#chgrp –R cvs /root/cvsroot
#chown –R cvsroot /root/cvsroot
1.2.3 初始化CVS
需要在cvsroot用户下执行
#su – cvsroot
初始化CVS服务器的根目录,以后创建的CVS项目都将建立在这个目录下,采用的命令如下:
#cvs -d /root/cvsroot init
这样目录/root/cvsroot就成为CVS服务器的根目录,以后创建的目录都将默认的存放在这个目录下。
1.2.4 设置环境变量
使用cvsroot用户登录,在这个用户下的.bash_profile环境配置文件,在这个文件中增加
CVSROOT=/var/cvsroot
export CVSROOT
1.2.5 启动CVS服务
在/etc/xinetd.d/目录下创建文件cvspserver,内容如下:
# default: on
# description: The cvs server sessions;
service cvspserver
{
socket_type = stream
wait = no
user = root
server = /usr/bin/cvs
server_args = -f --allow-root=/var/cvsroot pserver
log_on_failure += USERID
only_from = 216.245.143.71/24
}
其中only_from是用来限制访问的,可以根据实际情况不要或者修改。 注意:如果路径/var/cvsroot与上面创建的不一致,或者为/var/cvsroot/,将出现no such repository问题。
修改该文件权限:
# chmod 644 cvspserver
然后重新启动xinetd:
# /etc/rc.d/init.d/xinetd restart
然后察看cvs服务器是否已经运行:
# netstat -lnp|grep 2401
tcp 0 0 0.0.0.0:2401 0.0.0.0:* LISTEN xxxxxx/xinetd 或 #netstat -l |grep cvspserver
tcp 0 0 *:cvspserver *:* LISTEN
则说明cvs服务器已经运行。
1.2.6 配置cvs环境
在 cvs 管理员用户的HOME目录里有一个 CVSROOT 目录,这个目录里有三个配置文件,passwd, readers, writers,可以通过设置这三个文件来配置 CVS 服务器,下面分别介绍这几个文件的作用:
passwd:cvs 用户的用户列表文件,它的格式很象 shadow 文件:
{cvs 用户名}:[加密的口令]:[等效系统用户名]
readers:有 cvs 读权限的用户列表文件。就是一个一维列表。在这个文件中的用户对 cvs只有读权限。
writers:有 cvs 写权限的用户的列表文件。和 readers 一样,是一个一维列表。在这个文件中的用户对 cvs 有写权限。
注意:如果用户同时在readers和writers文件存在,则这个用户只有read的权限而没有write的权限。
1、创建可以登陆cvs服务的用户及密码,需要创建文件passwd
vi /root/cvsroot/CVSROOT/passwd
文件内容如下:
smilings:xxxxx:cvsroot
chenxu:xxxxx:cvsroot
此文件的意思是smilings和chenxu两个用户可以登陆cvs服务器,登陆后其权限为用户cvsroot的权限
注意:cvs用户和服务器用户是可以不一样的
2、xxxxxx为密码,由以下文件生成:
vi /var/cvsroot/passwdgen.pl
文件内容:
#!/usr/bin/perl
srand (time());
my $randletter = "(int (rand (26)) + (int (rand (1) + .5) % 2 ? 65 : 97))";
my $salt = sprintf ("%c%c", eval $randletter, eval $randletter);
my $plaintext = shift;
my $crypttext = crypt ($plaintext, $salt);
print "${crypttext}/n";
3、修改passwdgen.pl为可执行
#chmod +x passwdgen.pl
如果需要密码为:smilings,则敲入:
passwdgen.pl "smilings"
回车即可得到加密密码,用其替换passwd文件中的xxxxxx
4、编辑 writers 文件,加入下面几行:
smilings
chenxu
注:passwd文件的格式是:
以":"为分隔,分为三部分:
第一部分是cvs帐号名(与系统帐号无关,也可与系统帐号名相同)
第二部分(可选项)是加密串,每个系统用户的加密串缺省是在/etc/shadow中,如果cvs帐号不是操作系统的帐号,shadow中是不会有cvs帐号的加密串的,这时就必须手工为cvs帐号生成加密串,可以将其他系统帐号的密码修改成想要的密码(此时shadow文件的加密 串跟着改变),在取得加密串后改回去。当第二部分置空时,该帐号以任何口令均可登入cvs server
第三部分(可选项)是一个操作系统帐号, 如果登陆成功, cvs用户就以此系统帐号的身份存取cvs中的源代码,这里的系统帐号是cvs权限控制的关键, 这个系统帐号有什么权限, 以此帐号身份存取cvs的cvs用户就有相同的权限.。注意: 考虑到cvs用户是以某个系统帐号的身份运行的, 此系统帐号应当对repository下的相应目录有写的权限, 这样就存在直接进入目录对文件进行修改的可能, 而这是cvs操作所不允许的,为了避免这种误操作, 建议在产生此系统帐号时使其shell为/bin/false, 并且不设置此帐号的密码,这样可以禁止直接以此系统帐号telnet或者ftp进入CVS Server。
另外,passwd文件中的用户不能重名,否则只有第一个有效。
1.3 CVS Client端的配置
1.3.1 Unix/Linux环境下
CVS服务器正确安装置后,就可以设置Client端来操作了。
设置方法是:将环境变量增加到.profile/bash_profile中:
export CVSROOT=:pserver: smilings@216.245.143.71:/root/cvsroot
%cvs login 系统将提示输入CVS口令
口令认证通过后,就可以进行CVS的操作了。
1.3.2 Windows环境下
在http://www.wincvs.org下载最新wincvs软件并安装。
设置环境CVSROOT变量:
运行wincvs,从界面菜单处,选择admin --> preference --> General -->设置CVSROOT为::pserver:a@216.245.143.71:/root/cvsroot
其中的a为用户的CVS帐号,@后面是CVS服务器的IP地址。
当cvs server的端口不是缺省的2401时,需要在
admin --> preference --> Ports -->设置For "pserver"(passwd) port为定义的值。
第2章 CVS的基本操作
2.1 Unix/Linux环境下的操作说明
(1) 登录CVS Server
%cvs login
CVS password: ******
注: 如果此时提示.cvspass文件不存在,只要手工创建一个即可: %touch .cvspass
(2) 查看帮助
% cvs --help
%cvs –help-options
%cvs –help-commands
(3) 检取源代码(将CVS服务器端的源代码下载到本地。则本地上的内容为服务器端的一个拷贝)
cvs co [-r tagname/revision] filename|directory
例:%cvs co -r aiobs61_dev products/aiobs/aiip
%cvs co [–D " 1 Dec 2002 "/2002-12-1/"1 Dec 20:22 "] file1
(4) 增加文件或目录到CVS 库中
$ cvs add filename|directory
(5) 提交文件
%cvs ci [-r revision] [ -m"add new functions"] [filename]
增加文件后,需要再执行cvs ci命令,才能完成永久提交。
增加目录后,则不需要再另外执行cvs ci 命令了。
(6) 更新当前工作目录中的文件
%cvs update [-d] [filename]
-d: 取出新增加的目录 = cvs co
(7) 查看文件历史记录
%cvs log [filename]
将给出文件的所有修改记录,版本信息,修改人, 修改时间及更改说明等。
(8) 比较文件
%cvs diff filename
cvs diff可以用来比较本地工作目录和server上的文件,也可以用来比较文件的两个版本之间的差异,实现的是按行比较。对二进制文件则无效。
%cvs diff –r aiobs filename
比较本地和另外一个分支上(分支Tag为aiobs)的文件差异
%cvs diff -D 2002-1-3 -r cbs_rm ora.sql
比较某个日期与某个分支下的文件差异
(9) 显示文件的当前状态
$cvs status filename
常见三种状态:Up-to-date, Need-patch, Locally Modified
Up-to-date:表示该文件已经与CVS服务器端的最新版本是一致的
Need-patch:表示该文件的本地版本低于服务器端的最新版本,需要从服务器端下载更新的版本
Locally Modified:表示该文件在本地已经做过修改了,但还没有提交到服务器上
(10) 删除文件------分三步
%rm filename (先从工作目录中删除)
%cvs remove filename (从CVS中删除)
%cvs commit filename (永久删除)
(11) 删除目录
首先将目录中的所有文件从cvs中删除
% cd ..
% cvs update –p
-p: 告诉update从工作目录中删除这些空目录
即删除了目录下的所有文件,则CVS认为该目录已经被删除了
(12) 给产品/模块打tag
相当给产品或者模块做一个标签或快照
cvs rtag tagname products/module
或 cvs tag tagname products/module
以上两个命令功能相似,区别在于rtag直接到CVS服务器端为源代码加Tag,而使用cvs tag命令则需要事先把源代码checkout到本地。
(13) 建立分支
cvs rtag –b tagname products/module
或cvs tag –b tagname products/module
建立分支常用于程序bug的跟踪、修复。执行cvs tag/rtag命令时,如果使用-b参数,则表示该Tag是一个分支Tag,用户使用这个Tag可以对程序进行修改和提交。而如(12)中建立的普通Tag则只能做查询用。
2.2 Windows环境下的操作说明
(1) 运行wincvs程序
第一次运行时,在界面上弹出"wincvs preferences" 对话窗,以后进入时,通过选中菜单Admin--->preferences,可进入wincvs参数配置对话窗), 设置如下:
在general页中设置CVSROOT 为:
:pserver:username@hostname:/root/cvsroot,
username是访问cvs的用户名及其密码,由CVS 管理员提供。
设置Authentication为: "passwd" file on the cvs server
如果不希望删除空目录,在Globals页面中去掉"Prune (remove) empty directories" 选项, 并同时去掉此页中的 " chekcout readonly".在WinCvs页中,设置"HOME folder"为自己的工作目录,如: E:/work
(2) 在图标栏选中"change location"图标(在目录下拉框的右边)改变缺省工作目录为:E:/work
(3) checkout某个module到本地
选中admin--->login,输入PASSWD
选中create--->checkout module....将弹出的对话框,在checkout settings页中, 设置module name 如: products/aiobs63/testcase,设置local folder to checkout to: 为E:/work, 在"checkout options"页中可以设置根据日期(通过选中by date 日期格式为:YYYY-MM-DD Hour:Mins) 或者版本号(通过选中by revision/tag/branch)来checkout module,点击"确定"即可将testcase目录下的全部文件check out出来。
(4) 增加某个已有的module(目录)到CVS服务器中
选中create--->import module-选择一个需要checkin的目录
(例如 E:/work/products/aiobs63/testcase)在Import setting页中设置 "select module name and path in the remote server" ,输入你需要提交的位置例如: product/aiobs63/testcase,在vendor tag 和release tag中加入相应的标签, 在"Enter the log message"框内输入日志, 点击确定
增加add
Modify---> add selection
提交commit
(5) checkin 某个文件
运行wincvs程序,在右边的文件列表框中,选择需要check in的文件名-点右键- 选择"commit selection"-在commit setting中的"enter the log message"输入修改日志-确认。
(6) checkout某个文件
运行wincvs程序,在右边的文件列表框中,选择需要check out的文件名-点右键- 选择"update selection"-在"stick options"页中可以设置根据日期(通过选中"before date" 日期格式为:YYYY-MM-DD Hour:Mins)或者版本号(通过选中revision/tag/branch)来checkout 文件。
(7) 如何打tag
注意: 为了便于产品管理,公司软件产品的tag都是由Build Master打的。
对module打tag:选中module(通过wincvs界面中间部分左边地module页)然后选择create--create tag by modules,在create tag settings中输入tag名和module 名.
对文件打tag:选中需要打tag地文件,选择modify-create a tag on selection在enter the tag name to create中输入tag名
(8) 如何将本地新文档checkin到CVS
选中新文档,选择modify-add selection,如果是NONCVS FILE(在文件status栏出现), 则会出现警告,此时应选择modify--add selection binary(以二进制方式add)。 然后选择modify-commit selection将文件提交到CVS库中。
(9) CVSlog修改日志
在每次文档修改时,请按照下列内容,记录修改日志
修改主题:
修改章节:
修改人:
修改时间:
这些信息将被写入wincvs的cvslog中
tips:
如果只是在WinCVS中check in 了新的folder,在unix下仍然看不到,需要先使用: cvs upd –d foldername