您的位置:首页 > 其它

CVS使用手册

2012-08-21 17:19 344 查看
CVS使用手册
作者:车东
发表于:2002-02-06 18:02
最后更新于:2008-02-15 22:02

版权声明:可以任意转载,转载时请务必以超链接形式标明文章原始出处和作者信息及本声明

http://www.chedong.com/tech/cvs_card.html

CVS是一个C/S系统,多个开发人员通过一个中心版本控制系统来记录文件版本,从而达到保证文件同步的目的。工作模式如下:
CVS服务器(文件版本库)

/ | \

(版本同步)

/ | \

开发者1
开发者2
开发者3
作为一般开发人员挑选2,6看就可以了,CVS的管理员则更需要懂的更多一些,最后还简单介绍了一些Windows下的cvs客户端使用,CVS远程用户认证的选择及与BUG跟踪系统等开发环境的集成问题。
1. CVS环境初始化:CVS环境的搭建管理员
2. CVS的日常使用:日常开发中最常用的CVS命令,开发人员管理员
3. CVS的分支开发:项目按照不同进度和目标并发进行管理员
4. CVS的用户认证:通过SSH的远程用户认证,安全,简单管理员
5. CVSWEB:CVS的WEB访问界面大大提高代码版本比较的效率管理员
6. CVS TAG:将$Id$
加入代码注释中,方便开发过程的跟踪开发人员
7. CVS vs VSS: CVS和Virsual
SourceSafe的比较开发人员管理员
8. WinCVS:通过SSH认证的WinCVS认证设置
9. 基于CVSTrac的小组开发环境搭建:通过CVSTrac实现web界面的CVS用户管理,集成的BUG跟踪和WIKI交流
10. CVS中的用户权限管理:基于系统用户的CVS权限管理和基于CVSROOT/passwd的虚拟用户管理
一个系统20%的功能往往能够满足80%的需求,CVS也不例外,以下是CVS最常用的功能,可能还不到它全部命令选项的20%,作为一般开发人员平时会用cvs
update和cvs commit就够了,更多的需求在实际应用过程中自然会出现,不时回头看看相关文档经常有意外的收获。
CVS环境初始化
环境设置:指定CVS库的路径CVSROOT

tcsh

setenv CVSROOT /path/to/cvsroot

bash

CVSROOT=/path/to/cvsroot ; export CVSROOT
后面还提到远程CVS服务器的设置:

CVSROOT=:ext:$USER@test.server.address#port:/path/to/cvsroot CVS_RSH=ssh; export CVSROOT CVS_RSH

初始化:CVS版本库的初始化。

cvs init
一个项目的首次导入

cvs import -m "write some comments here" project_name vendor_tag release_tag

执行后:会将所有源文件及目录导入到/path/to/cvsroot/project_name目录下

vender_tag:
开发商标记

release_tag:
版本发布标记
项目导出:将代码从CVS库里导出

cvs checkout project_name

cvs
将创建project_name目录,并将最新版本的源代码导出到相应目录中。这个checkout和Virvual
SourceSafe中的check out不是一个概念,相对于Virvual SourceSafe的check
out是cvs update, check in是cvs
commit。
CVS的日常使用

注意:第一次导出以后,就不是通过cvs checkout来同步文件了,而是要进入刚才cvs
checkout project_name导出的project_name目录下进行具体文件的版本同步(添加,修改,删除)操作。
将文件同步到最新的版本

cvs update

不制定文件名,cvs将同步所有子目录下的文件,也可以制定某个文件名/目录进行同步

cvs update file_name

最好每天开始工作前或将自己的工作导入到CVS库里前都要做一次,并养成“先同步后修改”的习惯,和Virvual
SourceSafe不同,CVS里没有文件锁定的概念,所有的冲突是在commit之前解决,如果你修改过程中,有其他人修改并commit到了CVS
库中,CVS会通知你文件冲突,并自动将冲突部分用

>>>>>>

content on cvs server

<<<<<<

content in your file

>>>>>>

标记出来,由你确认冲突内容的取舍。

版本冲突一般是在多个人修改一个文件造成的,但这种项目管理上的问题不应该指望由CVS来解决。
确认修改写入到CVS库里

cvs commit -m "write some comments here" file_name
注意:CVS的很多动作都是通过cvs
commit进行最后确认并修改的,最好每次只修改一个文件。在确认的前,还需要用户填写修改注释,以帮助其他开发人员了解修改的原因。如果不用写-m "comments"而直接确认`cvs
commit file_name` 的话,cvs会自动调用系统缺省的文字编辑器(一般是vi)要求你写入注释。

注释的质量很重要:所以不仅必须要写,而且必须写一些比较有意义的内容:以方便其他开发人员能够很好的理解

不好的注释,很难让其他的开发人员快速的理解:比如: -m "bug fixed"
甚至 -m ""

好的注释,甚至可以用中文: -m "在用户注册过程中加入了Email地址校验"

修改某个版本注释:每次只确认一个文件到CVS库里是一个很好的习惯,但难免有时候忘了指定文件名,把多个文件以同样注释commit到CVS库里了,以下命令可以允许你修改某个文件某个版本的注释:

cvs admin -m 1.3:"write some comments here" file_name

添加文件

创建好新文件后,比如:touch new_file

cvs add new_file

注意:对于图片,Word文档等非纯文本的项目,需要使用cvs add -kb选项按2进制文件方式导入(k表示扩展选项,b表示binary),否则有可能出现文件被破坏的情况

比如:

cvs add -kb new_file.gif

cvs add -kb readme.doc
如果关键词替换属性在首次导入时设置错了怎么办?

cvs admin -kkv new_file.css

然后确认修改并注释

cvs ci -m "write some comments here"
删除文件

将某个源文件物理删除后,比如:rm file_name

cvs rm file_name

然后确认修改并注释

cvs ci -m "write some comments here"

以上面前2步合并的方法为:

cvs rm -f file_name

cvs ci -m "why delete file"

注意:很多cvs命令都有缩写形式:commit=>ci;
update=>up; checkout=>co/get; remove=>rm;
添加目录

cvs add dir_name

查看修改历史

cvs log file_name

cvs history file_name

查看当前文件不同版本的区别

cvs diff -r1.3 -r1.5 file_name

查看当前文件(可能已经修改了)和库中相应文件的区别

cvs diff file_name

cvs的web界面提供了更方便的定位文件修改和比较版本区别的方法,具体安装设置请看后面的cvsweb使用
正确的通过CVS恢复旧版本的方法:

如果用cvs update -r1.2 file.name

这个命令是给file.name加一个STICK TAG:
"1.2" ,虽然你的本意只是想将它恢复到1.2版本

正确的恢复版本的方法是:cvs update -p -r1.2 file_name >file_name

如果不小心已经加成STICK TAG的话:用cvs update -A
解决
移动文件/文件重命名

cvs里没有cvs move或cvs
rename,因为这两个操作是可以由先cvs remove old_file_name,然后cvs add new_file_name实现的。
删除/移动目录

最方便的方法是让管理员直接移动,删除CVSROOT里相应目录(因为CVS一个项目下的子目录都是独立的,移动到$CVSROOT目录下都可以作为新的独立项目:好比一颗树,其实砍下任意一枝都能独立存活),对目录进行了修改后,要求其开发人员重新导出项目cvs
checkout project_name 或者用cvs update -dP同步。
项目发布导出不带CVS目录的源文件

做开发的时候你可能注意到了,每个开发目录下,CVS都创建了一个CVS/目录。里面有文件用于记录当前目录和CVS库之间的对应信息。但项目发布的时候你一般不希望把文件目录还带着含有CVS信息的CVS目录吧,这个一次性的导出过程使用cvs
export命令,不过export只能针对一个TAG或者日期导出,比如:

cvs export -r release1 project_name

cvs export -D 20021023 project_name

cvs export -D now project_name
CVS Branch:项目多分支同步开发
确认版本里程碑:多个文件各自版本号不一样,项目到一定阶段,可以给所有文件统一指定一个阶段里程碑版本号,方便以后按照这个阶段里程碑版本号导出项目,同时也是项目的多个分支开发的基础。
cvs tag release_1_0
开始一个新的里程碑:

cvs commit -r 2 标记所有文件开始进入2.x的开发
注意:CVS里的revsion和软件包的发布版本可以没有直接的关系。但所有文件使用和发布版本一致的版本号比较有助于维护。
版本分支的建立

在开发项目的2.x版本的时候发现1.x有问题,但2.x又不敢用,则从先前标记的里程碑:release_1_0导出一个分支
release_1_0_patch

cvs rtag -b -r release_1_0 release_1_0_patch proj_dir
一些人先在另外一个目录下导出release_1_0_patch这个分支:解决1.0中的紧急问题,

cvs checkout -r release_1_0_patch

而其他人员仍旧在项目的主干分支2.x上开发
在release_1_0_patch上修正错误后,标记一个1.0的错误修正版本号

cvs tag release_1_0_patch_1
如果2.0认为这些错误修改在2.0里也需要,也可以在2.0的开发目录下合并release_1_0_patch_1中的修改到当前代码中:

cvs update -j release_1_0_patch_1
CVS的远程认证通过SSH远程访问CVS
使用cvs本身基于pserver的远程认证很麻烦,需要定义服务器和用户组,用户名,设置密码等,
常见的登陆格式如下:

cvs -d :pserver:cvs_user_name@cvs.server.address:/path/to/cvsroot login

例子:

cvs -d :pserver:cvs@samba.org:/cvsroot login
不是很安全,因此一般是作为匿名只读CVS访问的方式。从安全考虑,通过系统本地帐号认证并通过SSH传输是比较好的办法,通过在客户机的/etc/profile里设置一下内容:

CVSROOT=:ext:$USER@cvs.server.address#port:/path/to/cvsroot CVS_RSH=ssh; export CVSROOT CVS_RSH

所有客户机所有本地用户都可以映射到CVS服务器相应同名帐号了。
比如:
CVS服务器是192.168.0.3,上面CVSROOT路径是/home/cvsroot,另外一台开发客户机是192.168.0.4,如果
tom在2台机器上都有同名的帐号,那么从192.168.0.4上设置了:

export CVSROOT=:ext:tom@192.168.0.3:/home/cvsroot

export CVS_RSH=ssh

tom就可以直接在192.168.0.4上对192.168.0.3的cvsroot进行访问了(如果有权限的话)

cvs checkout project_name

cd project_name

cvs update

...

cvs commit
如果CVS所在服务器的SSH端口不在缺省的22,或者和客户端与CVS服务器端SSH缺省端口不一致,有时候设置了:

:ext:$USER@test.server.address#port:/path/to/cvsroot

仍然不行,比如有以下错误信息:

ssh: test.server.address#port: Name or service not known

cvs [checkout aborted]: end of file from server (consult above messages if any)

解决的方法是做一个脚本指定端口转向(不能使用alias,会出找不到文件错误):

创建一个/usr/bin/ssh_cvs文件,假设远程服务器的SSH端口是非缺省端口:34567

#!/bin/sh

/usr/bin/ssh -p 34567 "$@"

然后:chmod +x /usr/bin/ssh_cvs

并CVS_RSH=ssh_cvs; export CVS_RSH
注意:port是指相应服务器SSH的端口,不是指cvs专用的pserver的端口
CVSWEB:提高文件浏览效率
CVSWEB就是CVS的WEB界面,可以大大提高程序员定位修改的效率:
使用的样例可以看:http://www.freebsd.org/cgi/cvsweb.cgi
CVSWEB的下载:CVSWEB从最初的版本已经演化出很多功能界面更丰富的版本,这个是我个人感觉安装设置比较方便的:

原先在:http://www.spaghetti-code.de/software/linux/cvsweb/,但目前已经删除,目前仍可以在本站下载CVSWEB,其实最近2年FreeBSD的CVSWeb项目已经有了更好的发展吧,而当初没有用FreeBSD那个版本主要就是因为没有彩色的文件Diff功能。

下载解包:

tar zxf cvsweb.tgz

把配置文件cvsweb.conf放到安全的地方(比如和apache的配置放在同一个目录下),

修改:cvsweb.cgi让CGI找到配置文件:

$config = $ENV{'CVSWEB_CONFIG'} || '/path/to/apache/conf/cvsweb.conf';

转到/path/to/apache/conf下并修改cvsweb.conf:
1. 修改CVSROOT路径设置:

%CVSROOT = (

'Development' => '/path/to/cvsroot', #<==修改指向本地的CVSROOT

);
2. 缺省不显示已经删除的文档:

"hideattic" => "1",#<==缺省不显示已经删除的文档
3. 在配置文件cvsweb.conf中还可以定制页头的描述信息,你可以修改$long_intro成你需要的文字
CVSWEB可不能随便开放给所有用户,因此需要使用WEB用户认证:

先生成 passwd:

/path/to/apache/bin/htpasswd -c cvsweb.passwd user

修改httpd.conf:
增加

<Directory "/path/to/apache/cgi-bin/cvsweb/">

AuthName "CVS Authorization"

AuthType Basic

AuthUserFile /path/to/cvsweb.passwd

require valid-user

</Directory>
CVS TAGS: $Id$
将$Id$
加在程序文件开头的注释里是一个很好的习惯,cvs能够自动解释更新其中的内容成:file_name version time user_name
的格式,比如:cvs_card.txt,v 1.1 2002/04/05 04:24:12 chedong Exp,可以这些信息了解文件的最后修改人和修改时间。
几个常用的缺省文件:

default.php

<?php

/*

* Copyright (c) 2002 Company Name.

* $Header$

*/

?>

====================================

Default.java: 注意文件头一般注释用 /*
开始 JAVADOC注释用 /**
开始的区别

/*

* Copyright (c) 2002 MyCompany Name.

* $Header$

*/

package com.mycompany;

import java.;

/**

* comments here

*/

public class Default {

/**

* Comments here

* @param

* @return

*/

public toString() {

}

}

====================================

default.pl:

#!/usr/bin/perl -w

# Copyright (c) 2002 Company Name.

# $Header$

# file comments here

use strict;
CVS vs VSS
CVS没有文件锁定模式,VSS在check
out同时,同时记录了文件被导出者锁定。
CVS的update和commit,
VSS是get_lastest_version和check in

对应VSS的check out/undo
check out的CVS里是edit和unedit

在CVS中,标记自动更新功能缺省是打开的,这样也带来一个潜在的问题,就是不用-kb方式添加binary文件的话在cvs自动更新时可能会导致文件失效。
$Header$ $Date$这样的标记在Virsual SourceSafe中称之为Keyword
Explaination,缺省是关闭的,需要通过OPITION打开,并指定需要进行源文件关键词扫描的文件类型:*.txt,*.java, *.html...
对于Virsual SourceSafe和CVS都通用的TAG有:

$Header$

$Author$

$Date$

$Revision$
我建议尽量使用通用的关键词保证代码在CVS和VSS都能方便的跟踪。
WinCVS
下载:
cvs Windows客户端:目前稳定版本为1.2

http://cvsgui.sourceforge.net

ssh Windows客户端

http://www.networksimplicity.com/openssh/

安装好以上2个软件以后:

WinCVS客户端的admin==>preference设置

1 在general选单里

设置CVSROOT:
username@192.168.0.123:/home/cvsroot

设置Authorization:
选择SSH server

2 Port选单里

钩上:check for alternate rsh name

并设置ssh.exe的路径,缺省是装在 C:\Program Files\NetworkSimplicity\ssh\ssh.exe

然后就可以使用WinCVS进行cvs操作了,所有操作都会跳出命令行窗口要求你输入服务器端的认证密码。
当然,如果你觉得这样很烦的话,还有一个办法就是生成一个没有密码的公钥/私钥对,并设置CVS使用基于公钥/私钥的SSH认证(在general
选单里)。
可以选择的diff工具:examdiff

下载:

http://www.prestosoft.com/examdiff/examdiff.htm

还是在WinCVS菜单admin==>preference的WinCVS选单里

选上:Externel diff program

并设置diff工具的路径,比如:C:\Program Files\ed16i\ExamDiff.exe

在对文件进行版本diff时,第一次需要将窗口右下角的use externel diff选上。
基于CVSTrac的小组开发环境搭建
作为一个小组级的开发环境,版本控制系统和BUG跟踪系统等都涉及到用户认证部分。如何方便的将这些系统集成起来是一个非常困难的事情,毕竟我们不能指望
Linux下有像Source Offsite那样集成度很高的版本控制/BUG跟踪集成系统。

我个人是很反对使用pserver模式的远程用户认证的,但如果大部分组员使用WINDOWS客户端进行开发的话,总体来说使用
CVSROOT/passwd认证还是很难避免的,但CVS本身用户的管理比较麻烦。本来我打算自己用perl写一个管理界面的,直到我发现了
CVSTrac:一个基于WEB界面的BUG跟踪系统,它外挂在CVS系统上的BUG跟踪系统,其中就包括了WEB界面的CVSROOT/passwd文件的管理,甚至还集成了WIKIWIKI讨论组功能。
这里首先说一下CVS的pserver模式下的用户认证,CVS的用户认证服务是基于inetd中的:

cvspserver stream tcp nowait apache /usr/bin/cvs cvs --allow-root=/home/cvsroot pserver

一般在2401端口(这个端口号很好记:49的平方)

CVS用户数据库是基于CVSROOT/passwd文件,文件格式:

[username]:[crypt_password]:[mapping_system_user]

由于密码都用的是UNIX标准的CRYPT加密,这个passwd文件的格式基本上是apache的htpasswd格式的扩展(比APACHE的
PASSWD文件多一个系统用户映射字段),所以这个文件最简单的方法可以用

apache/bin/htpasswd -b myname mypassword

创建。注意:通过htpasswd创建出来的文件会没有映射系统用户的字段

例如:

new:geBvosup/zKl2

setup:aISQuNAAoY3qw

test:hwEpz/BX.rEDU
映射系统用户的目的在于:你可以创建一个专门的CVS服务帐号,比如用apache的运行用户apache,并将/home/cvsroot目录下的所有权限赋予这个用户,然后在passwd文件里创建不同的开发用户帐号,但开发用户帐号最后的文件读写权限都映射为apache用户,在SSH模式下多个系统开发用户需要在同一个组中才可以相互读写CVS库中的文件。
进一步的,你可以将用户分别映射到apache这个系统用户上。

new:geBvosup/zKl2:apache

setup:aISQuNAAoY3qw:apache

test:hwEpz/BX.rEDU:apache
CVSTrac很好的解决了CVSROOT/passwd的管理问题,而且包含了BUG跟踪报告系统和集成WIKIWIKI交流功能等,使用的
CGI方式的安装,并且基于GNU Public License
在inetd里加入cvspserver服务:

cvspserver stream tcp nowait apache /usr/bin/cvs cvs --allow-root=/home/cvsroot pserver
xietd的配置文件:%cat cvspserver

service cvspserver

{

disable = no

socket_type = stream

wait = no

user = apache

server = /usr/bin/cvs

server_args = -f --allow-root=/home/cvsroot pserver

log_on_failure += USERID

}
注意:这里的用户设置成apache目的是和/home/cvsroot的所有用户一致,并且必须让这个这个用户对/home/cvsroot/下的
CVSROOT/passwd和cvstrac初始化生成的myproj.db有读取权限。

安装过程
1. 下载:可以从http://www.cvstrac.org下载

我用的是已经在Linux上编译好的应用程序包:cvstrac-1.1.2.bin.gz,

%gzip -d cvstrac-1.1.2.bin.gz

%chmod +x cvstrac-1.1.2.bin

#mv cvstarc-1.1.1.bin /usr/bin/cvstrac

如果是从源代码编译:

http://www.sqlite.org/download.html 下载SQLITE的rpm包:

rpm -i sqlite-devel-2.8.6-1.i386.rpm

ftp://ftp.cvstrac.org/cvstrac/ 下载软件包

解包,假设解包到/home/chedong/cvstrac-1.1.2下,并规划将cvstrac安装到/usr/local/bin目录下,
cd /home/chedong/cvstrac-1.1.2 编辑linux-gcc.mk:

修改:

SRCDIR = /home/chedong/cvstrac-1.1.2

INSTALLDIR = /usr/local/bin

然后

mv linux-gcc.mk Makefile

make

#make install
2. 初始化cvstrac数据库:假设数据库名是
myproj

在已经装好的CVS服务器上(CVS库这时候应该已经是初始化好了,比如:cvs
init初始化在/home/cvsroot里),运行一下

%cvstrac init /home/cvsroot myproj

运行后,/home/cvsroot里会有一个的myproj.db库,使用CVSTRAC服务,/home/cvsroot/myproj.db
/home/cvsroot/CVSROOT/readers /home/cvsroot/CVSROOT/writers /home/cvsroot/CVSROOT/passwd这几个文件对于web服务的运行用户应该是可写的,在RedHat8上,缺省就有一个叫
apache用户和一个apache组,所以在httpd.conf文件中设置了用apache用户运行web服务:

User apache

Group apache,

然后设置属于apache用户和apache组

#chown -R apache:apache /home/cvsroot

-rw-r--r-- 1 apache apache 55296 Jan 5 19:40 myproj.db

drwxrwxr-x 3 apache apache 4096 Oct 24 13:04 CVSROOT/

drwxrwxr-x 2 apache apache 4096 Aug 30 19:47 some_proj/

此外还在/home/cvsroot/CVSROOT中设置了:

chmod 664 readers writers passwd
3. 在apche/cgi-bin目录中创建脚本cvstrac:

#!/bin/sh

/usr/bin/cvstrac cgi /home/cvsroot

设置脚本可执行:

chmod +x /home/apache/cgi-bin/cvstrac
4. 从 http://cvs.server.address/cgi-bin/cvstrac/myproj 进入管理界面

缺省登录名:setup
密码 setup

对于一般用户可以从:
http://cvs.server.address/cgi-bin/cvstrac/myproj
5. 在setup中重新设置了CVSROOT的路径后,/home/cvsroot

如果是初次使用需要在/home/cvsroot/CVSROOT下创建passwd,
readers, writers文件

touch passwd readers writers

然后设置属于apache用户,

chown apache.apache passwd readers writers

这样使用setup用户创建新用户后会同步更新CVSROOT/passwd下的帐号
修改登录密码,进行BUG报告等,

更多使用细节可以在使用中慢慢了解。
对于前面提到的WinCVS在perference里设置:

CVSROOT栏输入:username@ip.address.of.cvs:/home/cvsroot

Authenitication选择:use passwd file on server side

就可以了从服务器上进行CVS操作了。
CVS的用户权限管理
CVS的权限管理分2种策略:
· 基于系统文件权限的系统用户管理:适合多个在Linux上使用系统帐号的开发人员进行开发。
· 基于CVSROOT/passwd的虚拟用户管理:适合多个在Windows平台上的开发人员将帐号映射成系统帐号使用。
为什么使用apache/apache用户?首先RedHat8中缺省就有了,而且使用这个用户可以方便通过cvstrac进行WEB管理。

chown -R apache.apache /home/cvsroot

chmod 775 /home/cvsroot
Linux上通过ssh连接CVS服务器的多个开发人员:通过都属于apache组实现文件的共享读写

开发人员有开发服务器上的系统帐号:sysuser1 sysuser2,设置让他们都属于apache组,因为通过cvs新导入的项目都是对组开放的:664权限的,这样无论那个系统用户导入的项目文件,只要文件的组宿主是apache,所有其他同组系统开发用户就都可以读写;基于ssh远程认证的也是一样。
apache(system group)

/ | \

sysuser1 sysuser2 sysuser3
Windows上通过cvspserver连接CVS服务器的多个开发人员:通过在passwd文件种映射成
apache用户实现文件的共享读写

他们的帐号通过CVSROOT/passwd和readers writers这几个文件管理;通过cvstrac设置所有虚拟用户都映射到apache用户上即可。
apache(system user)

/ | \

windev1 windev2 windev3

利用CVS WinCVS/CVSWeb/CVSTrac
构成了一个相对完善的跨平台工作组开发版本控制环境。
相关资源:
CVS HOME:

http://www.cvshome.org
CVS FAQ:

http://www.loria.fr/~molli/cvs-index.html

相关网站:

http://directory.google.com/Top/Computers/Software/Configuration_Management/Tools/Concurrent_Versions_System/
CVS--并行版本系统

http://www.soforge.com/cvsdoc/zh_CN/book1.html
CVS
免费书:

http://cvsbook.red-bean.com/
CVS命令的速查卡片 refcards.com/refcards/cvs/
WinCVS:

http://cvsgui.sourceforge.net/
CVSTrac: A Web-Based Bug And Patch-Set Tracking System For CVS

http://www.cvstrac.org
StatCVS:基于CVS的代码统计工具:按代码量,按开发者的统计表等
http://sourceforge.net/projects/statcvs
如何在WEB开发中规划CVS上:在Google上查
"cvs web development"

http://ccm.redhat.com/bboard-archive/cvs_for_web_development/index.html

一些集成了CVS的IDE环境:

Eclipse

Eclipse, CVS使用指南(转)

版权声明:转载时请以超链接形式标明文章原始出处和作者信息及本声明

http://hrbyzq.blogbus.com/logs/20754969.html
本文概述了 Eclipse
平台如何支持软件项目中的源代码版本控制。首先,我们将简要讨论一下团队代码开发的思想,然后研究 Eclipse
如何使用 CVS
代码资源库。我们还将研究一些源代码管理软件工具,可以通过 Eclipse
插件扩展来支持这些工具。

在团队项目中共享源代码

现今的大多数应用程序是由多人组成的团队开发的。即使只涉及几个开发人员的小项目,也需要对源代码的更改进行严格控制。这就是源代码管理软件的任务。源代码版本控制软件必须支持两个核心功能:
提供一种方法,能够协调对源代码的更改,并能集成这些更改

团队所提交工作的历史记录

当团队成员完成新的工作时,通过将这些更改提交到资源库来共享他们的工作。类似地,当他们希望获得最新可用的工作成果时,就可以根据资源库中的更改,更新自己的本地工作空间。这意味着项目资源库会因团队成员提交新工作成果而经常发生更改。换句话说,资源库应该表示项目的当前状态。任何时候,团队成员都要能够根据资源库更新自己的工作空间,并确信它们是最新的。
维护历史记录也很重要,那样就可以将当前工作与先前版本进行比较,如有必要,还可以回复到先前版本。协调团队的工作,以便只存在唯一的当前项目状态定义,以及包含团队已集成的工作,这些对于管理版本控制也是十分必要的。这种协调有可能是最难实现的目标。
最理想的模型是:团队的任何成员都可以对自己有权访问的任何资源进行更改。因为两个团队成员可以提交对同一资源的更改,所以有可能发生冲突,必须解决这种冲突。这种模型假定冲突具有唯一性。但遗憾的是,没有任何源代码是孤立地存在的;通常它包含与其它资源隐式或显式的相关性。源代码引用了在其它源代码资源中描述的构件。但源代码管理软件的工作就到此为止了,因为它并不能取代项目管理。项目管理者必须履行其职责:协调其它成员的工作以及负责进度、项目阶段和发布日期。此外,源代码管理也不能替代开发人员之间的交流。
Eclipse 平台如何支持代码管理

Eclipse 平台提供了作为团队在软件项目中共享代码和工作的能力。Eclipse
广泛地支持各种代码管理解决方案,这要归功于它的插件体系结构(不过,现已推出了对 CVS
的支持)。Eclipse
平台体系结构的重点在于工作空间。工作空间维护构建和测试软件项目所需的一切。它包含对象(源代码和资源)。它还保存了用于项目、IDE
和插件的配置设置。工作空间是在开发人员的机器上本地进行维护的,而团队通过外部资源库进行协作,不同开发人员的代码在资源库进行汇集。可以经由因特网通过“客户机-服务器”体系结构访问资源库。
Eclipse 平台提供了对于直接从工作空间进行团队开发操作的支持。这种支持允许开发人员并发地与几个独立的资源库以及不同版本的代码或项目进行交互。工作空间中的资源允许团队支持组件处理版本和配置管理问题。当然,单个工作空间可以同时访问不同类型的资源库。Eclipse
平台并没有提供它自己的代码管理解决方案;它总是依靠外部系统。Eclipse
平台只对一个(但也是最流行的一个)源代码管理系统提供内置支持:并发版本控制系统(Concurrent Versions System,CVS)。对第三方代码管理应用程序的支持一节中描述了使用第三方插件支持其它资源库。
CVS 是什么?

CVS 诞生于 1986
年,当时作为一组 shell
脚本而出现,但它现在已经发展成了最流行的针对软件开发人员的源代码版本管理解决方案。CVS
是用于代码版本管理的开放源码的客户机/服务器解决方案,它可用于各种平台,包括 Linux
和 Windows NT/2000/XP。请参阅本文末尾的参考资料,其中有 CVS
客户机、服务器和源代码的下载链接。
通常,CVS
的主要功能是记录源文件的历史。当一组开发人员从事同一个项目时,CVS
将他们彼此隔离开来。每个开发人员都在他/她自己的目录中独立工作,然后使用 CVS
资源库(不时地)合并工作结果。
Eclipse 拥有与 Eclipse
平台 IDE
紧密集成的内置 CVS
客户机,它是作为一个单独透视图(CVS Repository Exploring
透视图)而实现的,用于与 CVS
的交互。用于 CVS
的通用 Eclipse
设置(General Eclipse settings for CVS)位于 Window -> Preferences window -> Team
下。在切换到 CVS Repository Exploring
透视图之后,就可以使用所有 CVS
操作了(转至 Window -> Open Perspective -> Other -> CVS Repository Exploring。

先设置资源库的位置,它将定义用于选定 CVS
服务器/资源库的连接参数。

Eclipse/CVS 的源代码工作流

在 CVS
团队协作模型中,团队成员彼此独立地在他们各自的工作台上完成自己的所有工作。最后,他们希望共享其工作。他们通过 CVS
资源库实现这一点。CVS
使用分支(branch)模型来支持彼此独立而又高度相互依赖的多个工作流程(course of work)。这些分支是开发团队用来共享和集成正在进行中的工作的地方。可以认为分支是一个共享的工作台,当团队成员对源代码进行更改时就更新这个工作台。这个模型允许从事
CVS 团队项目的每个开发人员在进行更改时与其他成员共享其工作,以及在项目进展期间访问其他成员的工作。
一个称为 HEAD
的特殊分支用来表示资源库中的主要工作流程(HEAD
通常被称为主干)。当团队成员将资源提交给该分支时,会影响这些相关性。确保相关性的完整性是很重要的,因为该分支表示了当前项目的状态。当然,任何时候,团队成员都可以使用该分支的内容作为新工作的基础。
那些规则不仅适用于 CVS:无论使用哪种版本控制软件,团队项目中都有一些用于源代码管理的常见步骤。下面是一个使用 Eclipse
内置的 CVS
支持的示例工作流:
1. 启动新的团队项目

每个新的空 Eclipse
项目都可以通过 CVS(或受支持的任何其它源代码管理系统)进行共享。开发人员也可以通过将其现有的代码迁移到资源库来共享它。要进行共享,单击项目主文件夹,在显示的上下文菜单中使用 Team -> Share Project
选项

另一个选项是通过从选定的 CVS
资源库分支导入代码来创建新的工作台项目。只要选择适当分支(或 HEAD),然后选择从 CVS Repository Exploring
透视图中的上下文菜单中选择“Checkout As Project”选项

2. 使用代码并进行更改

开发人员通过 Eclipse
工作台在本地使用代码,包括的工作有创建新资源、修改现有资源、编写注释,并在他们使用后在本地保存这些内容。
3. 使本地更改与 CVS
资源库同步

如果一个项目开发人员准备提交他/她的工作,那么首先要执行更新操作。这会针对引入的更改核对资源库,并将这些更改添加到该开发人员的本地工作台。这样确保了开发人员知道这些更改可能会影响他/她将要提交的工作的完整性。使用项目上下文菜单中的 Compare With...
选项将本地版本与资源库中存储的代码进行比较

下一步是解决最后出现的任何冲突,并设法再次编译代码。如果一切正常,那么从项目上下文菜单使用 Team -> Commit...
选项执行提交操作,如图 6
所示。这会使所有更改都集成到资源库中。
4. 管理资源库

CVS 允许开发人员将更改隔离在开发的某些独立路径之内,这些路径称为分支。当一个开发人员更改某个分支上的文件时,这种更改不会出现在主干或其它分支上。那些分支被命名为子版本(subversion)或代码分叉(code
fork)。稍后,由合并操作将更改从一个分支迁移到另一个分支(或主干)。然后提交这些修订。这样就有效地将更改复制到了另一个分支上。使用项目上下文菜单的Team -> Branch...选项,Eclipse
使开发分支之间的迁移变得容易。
当然,当开发团队维护大型资源库时,有必要控制项目内的提交和合并操作。Eclipse/CVS
集成提供了一种特殊的视图:CVS Repository History(请参阅图 7)。它给出了关于团队成员在资源库中所执行更改的快速预览。

Eclipse 平台提供了几个支持代码管理的实用程序。最有用的是补丁功能。它将出自两个来源(譬如本地工作台和资源库)的代码进行比较,然后创建一个包含代码差异的类似 UNIX
的补丁文件(请参阅图 8)。可以将该文件发送给开发人员以将源代码升级到最新版本。

5. 断开项目与 CVS
的连接

当项目开发已经结束,并且团队希望冻结源代码时,可以从 HEAD
资源库删除该项目的最终版本。断开项目与 CVS
的连接将在该项目及其资源上禁用资源库操作,并删除与该项目相关联的 CVS
信息(这一操作是可选的)。
可以通过项目上下文菜单中的 Team -> Disconnect
选项执行断开连接操作。通过选择这个选项,会打开 Confirm Disconnect from CVS
对话框。在将该项目与资源库的连接断开之后,该团队必须确定如何处理 CVS
信息。第一个选项是“Delete the CVS meta information”;它将禁用 CVS
团队菜单操作并从文件系统中删除 CVS
文件夹及其内容。第二个选项是“Do not delete the CVS meta information”;它将禁用 CVS
团队菜单操作,但保留 CVS
元信息。
对第三方代码管理应用程序的支持

CVS 有几个重要的限制:它不能确定单个文件或整个文件集范围内同时进行的更改,它也不能检测文件之间的逻辑冲突。其冲突概念纯粹是文本意义上的,当对于同一基本文件的两个更改时间上非常非常接近,从而使合并命令受到干扰时,就会发生冲突。CVS
也不能提供任何类似于消息传递这样的交互式协作工具。幸运的是,CVS
并不是 Eclipse
平台所支持的唯一的源代码管理软件。开发人员可以通过插件扩展 Eclipse
平台的功能,而且目前(到 2003
年 3
月 4 日为止)已有 16
个可用于团队开发软件的插件。所有插件都是由 Eclipse
社区或商业软件供应商创建的。这些插件中的大多数添加了对第三方、商业源代码管理系统的支持。最有价值的插件是那些支持流行的企业代码管理系统(如 Merant PVCS
和 Rational ClearCase)的插件。例如,CVS-SSH2
插件允许通过 SSH2
会话访问 CVS,而 Microsoft Visual SourceSafe(VSS)团队提供程序插件添加了对
MS VSS 产品的支持(也可以在诸如 Linux
这样的非 Windows
平台上使用)。
但是,我本人所偏爱的插件是 Koi(请参阅参考资料以获取链接)。尽管它并非严格用于源代码控制,但这个创新的工具给协作开发注入了许多新的活力。其当前版本支持工作台到工作台的消息传递、共享标记、冲突更改通知、共享日历和事件通知。Koi
将 XML-RPC
用作其客户机-服务器体系结构中的通信模型。客户机是与“协作服务器”通信的单个
Eclipse 平台实例,而协作服务器也是一个 Eclipse
插件。Koi
使用以 JDBC 访问的关系数据库作为数据存储。可在参考资料中找到指向完整的、经过分类的 Eclipse
插件注册表的链接。
参考资料
请参加 eclipse.org
上的 Eclipse
平台社区。Eclipse
平台源代码遵循 Common Public License。Eclipse.org
还有一个 Eclipse
项目的术语和描述词汇表,以及技术文章和新闻组。Eclipse
平台白皮书(可在 Eclipse.org
主页获取)详细描述了 Eclipse
的主要组件和功能。
从 eclipse.org
下载 KOI
插件。
查看 Eclipse
插件的完整的、经过分类的注册表。
从 CVS
主页或 LORIA
站点下载 CVS 客户机、服务器和源代码。

请参阅 developerWorks
文章“Working the Eclipse Platform”,以了解关于 Eclipse
平台的背景知识。
请参阅 developerWorks
文章“Getting started with the Eclipse Platform”,这篇文章介绍了用 Eclipse
平台以及使用 Eclipse
插件编辑、编译和调试应用程序。

请参阅 developerWorks
文章“开发 Eclipse
插件”,这篇文章介绍了如何开发 Eclipse
插件。

从 developerWorks
的这些文章中获取关于 Eclipse
的更多信息:

在 developerWorks
开放源码项目专区查找更多有关 Eclipse
和开放源码参考资料。

关于作者

Pawel Leszek 是 Studio B
的一位作家,他是一位专长于 Linux/Win/Mac OS
系统体系结构和管理的独立软件顾问和作家。他具有许多操作系统、编程语言和网络协议方面的经验,尤其是 Lotus Domino
和 DB2
方面。Pawel 还在 LinuxWorld
上发表过一系列文章,他是 PC World
波兰版的 Linux
专栏作家。Pawel
和他的妻子以及可爱的小女儿住在华沙。欢迎提问并提出意见;您可以通过
pawel.leszek@ipgate.pl
与 Pawel
联系。
update 和 checkout
在执行中,会为每个文件打印一行提示信息,文件的状态通过前面的单个字符指明:

U file

文件按要求从仓库得到更新。用在那些仓库里面有但你的工作目录没有的文件,以及工作目录里面没有修改过,但旧于仓库的文件。

P file

类似 `U',但是 cvs
服务器发送的是补丁而不是整个文件。完成与 `U' 同样的工作,但降低带宽的使用。

A file

添加到你的私人副本中,当你使用 commit
后会加到仓库。这可以提醒你需要提交文件。

R file

从你的私人副本中删除,当你执行 commit
命令后会从仓库清除。这可以提醒你文件需要提交。

M file

在你的工作目录中,文件已经修改。

`M' 可以标明你工作的文件的两种状态:
同样的文件仓库里面没有修改,你的文件仍保持原样; 或者仓库里面的文件也有修改,但在工作目录里成功合并,没有冲突发生。

如果合并,cvs
将打印一些信息,并建立工作文件的备份(与 update
执行前相同)。update
运行时会打印相应的名字。

C file

合并你与仓库中修改到 file
时检测到冲突。file (你工作目录里面的副本)
是合并两个修订版的结果; 工作目录里面还有未修改文件的副本,名为 .#file.revision,其中 revision
是你修改的文件所基于的修订版。解决冲突见 Conflicts example
说明。 (注意,在有些系统里面,如果一段日子没有访问 .#
起头的文件,系统会自动清除。如果你需要保留这些原始的文件副本,最好将其改名) vms
系统中,文件名以 __ 开始,而不是 .#。

? file

file 处于工作目录,但是仓库里面没有对应的文件,它们也不是 cvs
忽略的文件(参见 `-I'
选项的说明,以及参阅 cvsignore)。

update的几个常用参数:

-D date

使用不迟于 date
的最新修订版。这是一个粘性的选项,含有 `-P'。见 Sticky tags,了解更多粘性标签/日期的信息。

-f

只与 `-D'
或 `-r' 标识一起使用。如果没有匹配的修订版,获取最新的修订版(而不是忽略这些文件)。

-k kflag

根据 kflag
处理关键字。参阅 Keyword substitution。此选项是粘性的;
以后在这个工作目录里面更新,还是使用相同的 kflag。status
命令可以看到粘性的选项。参阅 Invoking CVS,了解 status
命令的信息。

-l

只在当前工作目录里面执行。参阅 Recursive behavior.

-P

清除空目录。参阅 Moving directories.

-p

管道方式输出到标准输出。

-R

递归方式检出(默认)。参阅 Recursive behavior.

-r tag[:date]

获得 rev 修订版/标签,或者当 date
指定,并且 tag 是分支标签,分支 tag
上的版本可以当作是在 date 上。此选项是粘性的,含`-P'。参阅 Sticky tags
和 Common options 了解更多粘性标签/日期的信息。

update 还有一些特殊的选项。

-A

重置任何的粘性标签,日期,或 `-k'
选项。参阅Sticky tags,了解更多粘性标签/日期的信息。

-C

用仓库里面干净的副本覆盖本地的修改(但修改过的文件另存为 .#file.revision)。

-d

创建仓库里面存在而工作目录里面没有的目录。通常,update
只作用于你工作目录里面已经存在的文件和目录。

此选项通常用来更新最初检出创建的目录;
但也有不好的副作用。如果你在建立工作目录时,刻意避免仓库里面的某些目录(通过模块名,或在命令行上明确指定所需的文件和目录),用 `-d'
选项更新将创建这些你不想要的目录。

-I name

更新时忽略匹配 name
的文件(在工作目录里面)。你可以在命令行上多次使用 `-I'
指定多个要忽略的文件。`-I !' 可以避免忽略任何文件。参阅 cvsignore,
了解 cvs 忽略文件的其他方式。

-Wspec

指定更新时需要过滤的文件名。你可以重复使用此选项。

spec 可以是文件名模板,与 .cvswrappers
文件里面的类型相同。参阅 Wrappers.

-jrevision

通过两个 `-j'
选项,合并第一个 `-j' 选项指定的修订版至第二个 `j'
选项修订版的变更到工作目录。

使用一个 `-j'
选项,合并最初的修订版至 `-j' 选项指定修订版的变更到工作目录。最初的修订版是工作目录文件基于的修订版和 `-j'
选项指定修订版共同的祖先。

注意使用 `-j tagname'
选项而不是 `-j branchname',合并的通常不是从分支上删除文件的变更。参阅 Merging adds and removals,
了解详细情况。

另外,每个 `-j'
选项可以包含可选的日期规格,当用于分支时,可以限制修订版处于指定日期之内。可选的日期通过分号(:)加在标签里面: `-jSymbolic_Tag:Date_Specifier'.

本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/put2006/archive/2005/08/24/464318.aspx
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: