CVS 的基本工作思\是这LQ在一台服务器上徏立一个仓库,仓库里可以存放许多不同项目的源程序。由仓库理员统一理q些源程?q样Q就好象只有一个h在修Ҏ件一?避免了冲H?每个用户在用仓库之前,首先要把仓库里的目文g下蝲到本地。用户做的Q何修攚w先都是在本地q行Q然后用 cvs 命oq行提交Q由 cvs 仓库理员统一 修改.q样可以做到跟t文件变化,冲突控制{等.
׃ CVS 是典型的 C/S l构的YӞ因此它也分成服务器端和客L两部分。不q大多数CVS 软g都把它们合二Z了。我们这里就分别从服务器和客L的角度讨论cvs的用?/p>
Cvs服务器安?/p>
首先保pȝ安装有cvsQ?/p>
[root@mail xinetd.d]# rpm -qa|grep cvs
cvs-1.11.1p1-3
如果命o输出cM于上面的输出则说明系l已l安装有cvsQ否则就需要从安装光盘中安装cvs的rpm包?
一 创徏CVS属主用户Q?/p>
# useradd -d /cvsroot cvs
# chmod 771 /cv sroot
二、徏立CVS仓库(初始化cvs)
# su cvs
$ cvs -d /cvsroot init
$exit
#
四、启动cvs服务?/p>
?etc/xinetd.d/目录下创建文件cvspserverQ内容如下:
# 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=/cvsroot pserver
log_on_failure += USERID
only_from = 192.168.0.0/24
}
其中only_from是用来限制访问的Q可以根据实际情况不要或者修攏V?/p>
修改该文件权限:
# chmod 644 cvspserver
然后重新启动xinetdQ?/p>
# /etc/rc.d/init.d/xined restart
然后察看cvs服务器是否已l运行:
[root@mail xinetd.d]# netstat -lnp|grep 2401
tcp 0 0 0.0.0.0:2401 0.0.0.0:* LISTEN 7866/xinetd
则说明cvs服务器已l运行?/p>
五、创建用来访问cvs的用?/p>
前面创徏的cvs用户是cvs仓库理用户Q而ؓ了让用户讉K则还需要一个访问用P
# useradd cvspub
# usemod –G cvs cvspub
q里d了一个用户cvspubQƈ且将该用h加到cvsl中?/p>
六、管理cvs服务?/p>
理 cvs 服务?服务器可以用了,现在大家最兛_的就是如何管理服务器Q比如,我想让一些h有读?或写 CVS 仓库的权限,但是不想l它pȝ权限怎么办呢Q不难,cvs初始化结束以后,在管理员用户(q里是cvs用户)的主目录里有一?CVSROOT 目录Q这个目录里有三个配|文Ӟpasswd, readers, writers。我们可以通过讄q三个文件来配置 CVS 服务器,下面分别介绍q几个文件的作用Q?/p>
passwdQcvs 用户的用户列表文Ӟ它的格式很象 shadow 文gQ?/p>
{cvs 用户名}:[加密的口令]:[{效pȝ用户名]
如果你希望一个用户只?cvs 用户Q而不是系l用P那么你就要设|这个文Ӟ刚刚安装完之后这个文件可能不存在Q你需要以cvs理员n?su cvs)用户手工创徏Q当然要按照上面格式Q?/p>
W二个字D|该用L加密口oQ就是用 crypt (3) 加密的,你可以自己写一个程序来做加密,也可以用两个h的方法:先创Z个系l用P名字?cvs 用户一P口o是准备l它?cvs 用户口oQ创建完之后?/etc/shadow 把该用户W二个字D|贝过来,然后 再把q个用户删除.q个Ҏ对付数量的用户比较方便Qh一多就不合适了Q而且q有冲突条g(race condition)的安全隐患,q要 root 权限Q实在不怎么P不过权益之计而已Q另外一个方法就是利用apche的htpasswd命o创徏passwd用户Q添加用户只需要htpasswd passwd username卛_d用户到passwd文g中,不过需要在文g中对应行的最后添加一?#8220;:”冒号和对应的{效pȝ用户名;最好的是自己~写一个程序了来生成这个passwd文g了?/p>
W三个字D就是等效系l用户名Q实际上是赋与一?cvs 用户一个等效的pȝ用户的权限,看下面的例子你就明白它的功能了?/p>
readersQ有 cvs L限的用户列表文gQ就是一个一l列表。在q个文g中的用户?cvs
只有L限?/p>
writersQ有 cvs 写权限的用户的列表文Ӟ?readers 一P是一个一l列表。在q个文g中的用户?cvs 有写权限?/p>
上面三个文g在缺省安装的时候可能都不存在,需要我们自己创建,好吧Q现在还是让我们用一个例子来教学?假设我们有下面几个用户需要?cvsQ?/p>
cvsuser1, cvsuser2, henry, betty, anonymous
其中 laser ?gumpwu 是系l用P而henry, betty, anonymous 我们都不想给pȝ用户权限Qƈ?betty ?anonymous 都是只读用户Q而且 anonymous 更是q口令都没有?/p>
然后~辑 cvs 理员家目录?CVSROOT/passwd 文gQ加入下面几行:
laser:$xxefajfka;faffa33:cvspub
gumpwu:$ajfaal;323r0ofeeanv:cvspub
henry:$fajkdpaieje:cvspub
betty:fjkal;ffjieinfn/:cvspub
anonymous::cvspub
注意Q上面的W二个字D?分隔Wؓ :)是密文口令,你要用程序或者用我的土办法生成?/p>
~辑 readers 文gQ加入下面几行:
anonymous
betty
~辑 writer 文gQ加入下面几行:
laser
gumpwu
henry
q样?ok 了,你再用几个用户分别登陆测试,׃发现一切都 ok 了。这里面的原理和说明我想׃多说了,其实很简单,和系l管理用L概念是一L?/p>
七、徏立新的CVS目
一般我们都已经有一个或多个目了,q样我们可以用下面步骤生成一个新的CVS目?/p>
一个工E文件置于CVs中进行版本控Ӟ在CVS 术语中称作导?import)。从名字上就可以看出Q在导入前需要ؓ此作些准备工作?/p>
输入操作的基本要求是有个“q净”的目录结构?#8220;q净”的意思是不需要版本控制的文g都被U走?如编译生成的文gQ备份文件等{?。如果工E已l开始一D|间了Q这显得很重要。在目录中也许有些是不打将其置于版本控制下的文Ӟ但是又想他们放在这里,q种情况下,你要在输入之前将它们U走Q然后再Ud来?/p>
注意的是CVS 认ؓI目录是不存在的。如果想增加一个既不包含文件又不包含子目录的目录,需要在其下创徏一个哑文g。徏议你创徏一个名?README.txt 的文Ӟ其内容ؓ对目录的要说明?/p>
q入到已有项目的目录Q比如叫 cvstestQ?/p>
$cd cvstest
q行命o项目文件导入到cvs仓库中:
$cvs import -m "this is a cvstest project" cvstest v_0_0_1 start
说明Qimport 是cvs的命令之一Q表C向cvs仓库输入目文g.
-m参数后面的字串是描述文本Q对目q行描述Q如果不?-m 参数Q那么cvs会自动运行一个编辑器(一般是viQ但是可以通过修改环境变量EDITOR来改成你喜欢用的~辑?让你输入信息Qcvstest 是项目名U?实际上是仓库名,在CVS服务器上会存储在以这个名字命名的仓库?
v_0_0_1是这个分支的L?没啥?或曰不常?
start 是每?import 标识文g的输入层ơ的标记Q没啥用?/p>
q样我们徏立了一个CVS仓库了,然后Q我们可以把q个试目的文件删除,试验如何从仓库获取文件这会在后面的客L文章q行说明?/p>
该文章借鉴了何伟^先生的很多内容,在此表示感谢Q?
CVS是一个C/SpȝQ多个开发h员通过一个中心版本控制系l来记录文g版本Q从而达C证文件同步的目的。工作模式如下:
CVS服务器(文g版本库)
/ | \
Q版 ??步)
/ | \
开发? 开发? 开发?
作ؓ一般开发h员挑?,6看就可以了,CVS的管理员则更需要懂的更多一些,最后还单介l了一些Windows下的cvs客户端用,CVSq?E用戯证的选择及与BUG跟踪pȝ{开发环境的集成问题?/p>
一个系l?0%的功能往往能够满80%的需求,CVS也不例外Q以下是CVS最常用的功能,可能q不到它全部命o选项?0%Q作Z般开发h员^时会用cvs update和cvs commit够了,更多的需求在实际应用q程中自然会出现Q不时回头看看相x档经常有意外的收莗?/p>
tcsh
setenv CVSROOT /path/to/cvsroot
bash
CVSROOT=/path/to/cvsroot ; export CVSROOT
后面q提到远ECVS服务器的讄Q?br />
CVSROOT=:ext:$USER@test.server.address#port:/path/to/cvsroot CVS_RSH=ssh; export CVSROOT CVS_RSH
初始化:CVS版本库的初始化?br />
cvs init
一个项目的首次导入
cvs import -m "write some comments here" project_name vendor_tag release_tag
执行后:会将所有源文g及目录导入到/path/to/cvsroot/project_name目录?br />
vender_tag: 开发商标记
release_tag: 版本发布标记
目导出Q将代码从CVS库里导出
cvs checkout project_name
cvs 创建project_name目录Qƈ最新版本的源代码导出到相应目录中。这个checkout和Virvual SourceSafe中的check out不是一个概念,相对于Virvual SourceSafe的check out是cvs updateQ?check in是cvs commit?/em>
注意Q第一ơ导Z后,׃是通过cvs checkout来同步文件了Q而是要进入刚才cvs checkout project_name导出的project_name目录下进行具体文件的版本同步Q添加,修改Q删除)操作?/strong>
文件同步到最新的版本
cvs update
不制定文件名Qcvs同步所有子目录下的文gQ也可以制定某个文g?目录q行同步
cvs update file_name
最好每天开始工作前或将自己的工作导入到CVS库里前都要做一ơ,q养?#8220;先同?后修?#8221;的习惯,和Virvual SourceSafe不同QCVS里没有文仉定的概念Q所有的冲突是在commit之前解决Q如果你修改q程中,有其他h修改qcommitCCVS 库中QCVS会通知你文件冲H,q自动将冲突部分?br />
>>>>>>
content on cvs server
<<<<<<
content in your file
>>>>>>
标记出来Q由你确认冲H内容的取舍?br />
版本冲突一般是在多个h修改一个文仉成的,但这U项目管理上的问题不应该指望由CVS来解冟?/em>
认修改写入到CVS库里
cvs commit -m "write some comments here" file_name
注意QCVS的很多动作都是通过cvs commitq行最后确认ƈ修改的,最好每ơ只修改一个文件。在认的前Q还需要用户填写修Ҏ释,以帮助其他开发h员了解修改的原因。如果不用写-m "comments"而直接确认`cvs commit file_name` 的话Qcvs会自动调用系l缺省的文字~辑?一般是vi)要求你写入注释?br />
注释的质量很重要Q所以不仅必要写,而且必须写一些比较有意义的内容:以方便其他开发h员能够很好的理解
不好的注释,很难让其他的开发h员快速的理解Q比如: -m "bug fixed" 甚至 -m ""
好的注释Q甚臛_以用中文: -m "在用h册过E中加入了Email地址校验"
修改某个版本注释Q每ơ只认一个文件到CVS库里是一个很好的习惯Q但隑օ有时候忘了指定文件名Q把多个文g以同h释commit到CVS库里了,?下命令可以允怽修改某个文g某个版本的注释:
cvs admin -m 1.3:"write some comments here" file_name
d文g
创徏好新文g后,比如Qtouch new_file
cvs add new_file
注意Q对于图片,Word文档{非U文本的目Q需要用cvs add -kb选项?q制文g方式导入(k表示扩展选项Qb表示binary)Q否则有可能出现文g被破坏的情况
比如Q?br />
cvs add -kb new_file.gif
cvs add -kb readme.doc
如果关键词替换属性在首次导入时设|错了怎么办?
cvs admin -kkv new_file.css
然后认修改q注?/span>
cvs ci -m "write some comments here"
删除文g
某个源文g物理删除后,比如Qrm file_name
cvs rm file_name
然后认修改q注?br />
cvs ci -m "write some comments here"
以上面前2步合q的Ҏ为:
cvs rm -f file_name
cvs ci -m "why delete file"
注意Q很多cvs命o都有~写形式Qcommit=>ci; update=>up; checkout=>co/get; remove=>rm;
d目录
cvs add dir_name
查看修改历史
cvs log file_name
cvs history file_name
查看当前文g不同版本的区?/u>
cvs diff -r1.3 -r1.5 file_name
查看当前文gQ可能已l修改了Q和库中相应文g的区?br />
cvs diff file_name
cvs的web界面提供了更方便的定位文件修改和比较版本区别的方法,具体安装讄L后面的cvsweb使用
正确的通过CVS恢复旧版本的ҎQ?br />
如果用cvs update -r1.2 file.name
q个命o是给file.name加一个STICK TAGQ?"1.2" Q虽然你的本意只是想它恢复?.2版本
正确的恢复版本的Ҏ是:cvs update -p -r1.2 file_name >file_name
如果不小心已l加成STICK TAG的话Q用cvs update -A 解决
Ud文g/文g重命?/u>
cvs里没有cvs move或cvs renameQ因两个操作是可以由先cvs remove old_file_nameQ然后cvs add new_file_name实现的?/p>
删除/Ud目录
最方便的方法是让管理员直接UdQ删除CVSROOT里相应目录(因ؓCVS一个项目下的子目录都是独立的,Ud?CVSROOT目录下都可以作ؓ新的 独立目Q好比一颗树Q其实砍下Q意一枝都能独立存z)Q对目录q行了修改后Q要求其开发h员重新导出项目cvs checkout project_name 或者用cvs update -dP同步?/p>
目发布导出不带CVS目录的源文g
做开发的时候你可能注意CQ每个开发目录下QCVS都创Z一个CVS/目录。里面有文g用于记录当前目录和CVS库之间的对应信息。但目发布的时?你一般不希望把文件目录还带着含有CVS信息的CVS目录吧,q个一ơ性的导出q程使用cvs export命oQ不qexport只能针对一个TAG或者日期导出,比如Q?br />
cvs export -r release1 project_name
cvs export -D 20021023 project_name
cvs export -D now project_name
cvs tag release_1_0
开始一个新的里E碑Q?br /> cvs commit -r 2 标记所有文件开始进?.x的开?/p>
注意QCVS里的revsion和Y件包的发布版本可以没有直接的关系。但所有文件用和发布版本一致的版本h较有助于l护?/em>
版本分支的徏?/u>
在开发项目的2.x版本的时候发?.x有问题,?.x又不敢用Q则从先前标记的里程:release_1_0导出一个分?release_1_0_patch
cvs rtag -b -r release_1_0 release_1_0_patch proj_dir
一些h先在另外一个目录下导出release_1_0_patchq个分支Q解?.0中的紧急问题,
cvs checkout -r release_1_0_patch
而其他h员仍旧在目的主q分?.x上开?/p>
在release_1_0_patch上修正错误后Q标C?.0的错误修正版本号
cvs tag release_1_0_patch_1
如果2.0认ؓq些错误修改?.0里也需要,也可以在2.0的开发目录下合ƈrelease_1_0_patch_1中的修改到当前代码中Q?br /> cvs update -j release_1_0_patch_1
常见的登陆格式如下:
cvs -d :pserver:cvs_user_name@cvs.server.address:/path/to/cvsroot login
例子Q?br />
cvs -d :pserver:cvs@samba.org:/cvsroot login
不是很安全,因此一般是作ؓ匿名只读CVS讉K的方式。从安全考虑Q通过pȝ本地帐号认证q过SSH传输是比较好的办法,通过在客h?/etc/profile里设|一下内容:
CVSROOT=:ext:$USER@cvs.server.address#port:/path/to/cvsroot CVS_RSH=ssh; export CVSROOT CVS_RSH
所有客h所有本地用户都可以映射到CVS服务器相应同名帐号了?/p>
比如:
CVS服务器是192.168.0.3Q上面CVSROOT路径?home/cvsrootQ另外一台开发客h?92.168.0.4Q如?tom?台机器上都有同名的帐P那么?92.168.0.4上设|了Q?br />
export CVSROOT=:ext:tom@192.168.0.3:/home/cvsroot
export CVS_RSH=ssh
tom可以直接在192.168.0.4上对192.168.0.3的cvsrootq行讉K了(如果有权限的话)
cvs checkout project_name
cd project_name
cvs update
...
cvs commit
如果CVS所在服务器的SSH端口不在~省?2Q或者和客户端与CVS服务器端SSH~省端口不一_有时候设|了Q?br />
:ext:$USER@test.server.address#port:/path/to/cvsroot
仍然不行Q比如有以下错误信息Q?br />
ssh: test.server.address#port: Name or service not known
cvs [checkout aborted]: end of file from server (consult above messages if any)
解决的方法是做一个脚本指定端口{向(不能使用aliasQ会出找不到文g错误Q:
创徏一?usr/bin/ssh_cvs文gQ假设远E服务器的SSH端口是非~省端口Q?4567
#!/bin/sh
/usr/bin/ssh -p 34567 "$@"
然后Qchmod +x /usr/bin/ssh_cvs
qCVS_RSH=ssh_cvs; export CVS_RSH
注意Qport是指相应服务器SSH的端口,不是指cvs专用的pserver的端?br />
使用的样例可以看Q?a >http://www.freebsd.org/cgi/cvsweb.cgi
CVSWEB的下载:CVSWEB从最初的版本已经演化出很多功能界面更丰富的版本,q个是我个h感觉安装讄比较方便的:
原先在:http://www.spaghetti-code.de/software/linux/cvsweb/Q但目前已经删除Q?a >目前仍可以在本站下蝲CVSWEBQ?其实最q?q?a >FreeBSD的CVSWeb目已经有了更好的发展吧Q而当初没有用FreeBSD那个版本 主要是因ؓ没有彩色的文件Diff功能?
下蝲解包Q?br />
tar zxf cvsweb.tgz
把配|文件cvsweb.conf攑ֈ安全的地方(比如和apache的配|放在同一个目录下Q,
修改Qcvsweb.cgi让CGI扑ֈ配置文gQ?br />
$config = $ENV{'CVSWEB_CONFIG'} || '/path/to/apache/conf/cvsweb.conf';
转到/path/to/apache/conf下ƈ修改cvsweb.confQ?/p>
CVSWEB可不能随便开攄所有用P因此需要用WEB用户认证Q?br />
先生?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>
几个常用的缺省文Ӟ
default.php
<?php
/*
* Copyright (c) 2002 Company Name.
* $Header$
*/
?>
====================================
Default.java: 注意文g头一般注释用 /* 开?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没有文g锁定模式QVSS在check out同时Q同时记录了文g被导锁定?
CVS的update和commitQ?VSS是get_lastest_version和check in
对应VSS的check out/undo check out的CVS里是edit和unedit
在CVS中,标记自动更新功能~省是打开的,q样也带来一个潜在的问题Q就是不?kb方式dbinary文g的话在cvs自动更新时可能会D 文g失效?/p>
$Header$ $Date$q样的标记在Virsual SourceSafe中称之ؓKeyword ExplainationQ缺省是关闭的,需要通过OPITION打开Qƈ指定需要进行源文g关键词扫描的文gcdQ?.txt,*.java, *.html...
对于Virsual SourceSafe和CVS都通用的TAG有:
$Header$
$Author$
$Date$
$Revision$
我徏议尽量用通用的关键词保证代码在CVS和VSS都能方便的跟t?
cvs Windows客户端:目前E_版本?.2
http://cvsgui.sourceforge.net
ssh Windows客户?br />
http://www.networksimplicity.com/openssh/
安装好以?个Y件以后:
WinCVS客户端的admin==>preference讄
1 在general选单?br />
讄CVSROOTQ?username@192.168.0.123:/home/cvsroot
讄Authorization: 选择SSH server
2 Port选单?br />
钩上Qcheck for alternate rsh name
q设|ssh.exe的\径,~省是装?C:\Program Files\NetworkSimplicity\ssh\ssh.exe
然后可以用WinCVSq行cvs操作了,所有操作都会蟩出命令行H口要求你输入服务器端的认证密码?
当然Q如果你觉得q样很烦的话Q还有一个办法就是生成一个没有密码的公钥/U钥对,q设|CVS使用Z公钥/U钥的SSH认证Q在general 选单里)?/p>
可以选择的diff工具Qexamdiff
下蝲Q?br />
http://www.prestosoft.com/examdiff/examdiff.htm
q是在WinCVS菜单admin==>preference的WinCVS选单?br />
选上QExternel diff program
q设|diff工具的\径,比如QC:\Program Files\ed16i\ExamDiff.exe
在对文gq行版本diffӞW一ơ需要将H口右下角的use externel diff选上?
q里首先说一下CVS的pserver模式下的用户认证QCVS的用戯证服务是Zinetd中的Q?br />
cvspserver stream tcp nowait apache /usr/bin/cvs cvs --allow-root=/home/cvsroot pserver
一般在2401端口Q这个端口号很好讎ͼ49的^方)
CVS用户数据库是ZCVSROOT/passwd文gQ文件格式:
[username]:[crypt_password]:[mapping_system_user]
׃密码都用的是UNIX标准的CRYPT加密Q这个passwd文g的格式基本上是apache的htpasswd格式的扩展(比APACHE?PASSWD文g多一个系l用h字D)Q所以这个文件最单的Ҏ可以?br />
apache/bin/htpasswd -b myname mypassword
创徏。注意:通过htpasswd创徏出来的文件会没有映射pȝ用户的字D?br />
例如Q?br />
new:geBvosup/zKl2
setup:aISQuNAAoY3qw
test:hwEpz/BX.rEDU
映射pȝ用户的目的在于:你可以创Z个专门的CVS服务帐号Q比如用apache的运行用户apacheQƈ?home/cvsroot目录?的所有权限赋予这个用P然后在passwd文g里创Z同的开发用户帐P但开发用户帐h后的文gd权限都映ؓapache用户Q在SSH模式?多个pȝ开发用户需要在同一个组中才可以怺dCVS库中的文件?/p>
q一步的Q你可以用户分别映到apacheq个pȝ用户上?br />
new:geBvosup/zKl2:apache
setup:aISQuNAAoY3qw:apache
test:hwEpz/BX.rEDU:apache
CVSTrac很好的解决了CVSROOT/passwd的管理问题,而且包含了BUG跟踪报告pȝ和集成WIKIWIKI交流功能{,使用?CGI方式的安装,q且ZGNU Public LicenseQ?br />
在inetd里加入cvspserver服务Q?br /> 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
}
注意Q这里的用户讄成apache目的是和/home/cvsroot的所有用户一_q且必须让这个这个用户对/home/cvsroot/下的 CVSROOT/passwd和cvstrac初始化生成的myproj.db有读取权限?/p>
安装q程
修改d密码Q进行BUG报告{,
更多使用l节可以在用中慢慢了解?br />
对于前面提到的WinCVS在perference里设|:
CVSROOT栏输入:username@ip.address.of.cvs:/home/cvsroot
Authenitication选择Quse passwd file on server side
可以了从服务器上进行CVS操作了?br />
CVS的权限管理分2U策略:
Linux上通过sshq接CVS服务器的多个开发h员:通过都属于apachel实现文件的׃nd
开发h员有开发服务器上的pȝ帐号Qsysuser1 sysuser2Q设|让他们都属于apachel,因ؓ通过cvs新导入的目都是对组开攄Q?64权限的,q样无论那个pȝ用户导入的项目文Ӟ?要文件的l宿LapacheQ所有其他同l系l开发用户就都可以读写;Zsshq程认证的也是一栗?br />
apache(system group)
/ | \
sysuser1 sysuser2 sysuser3
Windows上通过cvspserverq接CVS服务器的多个开发h员:通过在passwd文gU映成 apache用户实现文g的共享读?br /> 他们的帐号通过CVSROOT/passwd和readers writersq几个文件管理;通过cvstrac讄所有虚拟用户都映射到apache用户上即可?br />
apache(system user)
/ | \
windev1 windev2 windev3
利用CVS WinCVS/CVSWeb/CVSTrac 构成了一个相对完善的跨^台工作组开发版本控制环境?/p>
相关资源Q?
CVS HOMEQ?br /> http://www.cvshome.org
CVS FAQQ?br />
http://www.loria.fr/~molli/cvs-index.html
相关|站:
http://directory.google.com/Top/Computers/Software/Configuration_Management/Tools/Concurrent_Versions_System/
CVS--q行版本pȝ
http://www.soforge.com/cvsdoc/zh_CN/book1.html
CVS 免费?
http://cvsbook.red-bean.com/
CVS命o的速查卡片 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
StatCVSQ基于CVS的代码统计工P按代码量Q按开发者的l计表等
http://sourceforge.net/projects/statcvs
CVS ?Concurrent Version SystemQƈ行版本系l)的羃写,用于版本理。在多h团队开发中的作用更加明显。CVS 的基本工作思\是这LQ在一台服务器上徏立一个仓库,仓库里可以存放许多不同项目的源程序。由仓库理员统一理q些源程序。这P好象只有一个h在修Ҏ件一栗避免了冲突。每个用户在使用仓库之前Q首先要把仓库里的项目文件下载到本地。用户做的Q何修攚w先都是在本地q行Q然后用 cvs 命oq行提交Q由 cvs 仓库理员统一 修改。这样就可以做到跟踪文g变化Q冲H控制等{?
׃CVS是徏立在在原?Unix 体系里很成熟?SCCS ?RCS 的基上,所以CVS多是LinuxQUNIXQ系l中所使用Q本文中服务器端讄也是以LinuxZ?/p>
一、CVS服务器的安装
首先认pȝ中是否安装CVS服务Q?br />
[root@localhost /]# rpm -qa|grep cvs
cvs-1.11.2-cvshome.7x.1
如果命o输出cM于上面的输出则说明系l已l安装有cvsQ否则就需要从安装光盘中安装cvs的rpm包,或者到http://www.cvshome.org下蝲?/p>
1、徏?CVSROOT
目录Q因里涉及到用户对CVSROOT里的文gd的权限问题,所以比较简单的Ҏ是徏立一个组Q然后再建立一个属于该l的帐户Q而且以后有读写权限的用户都要属于该组。假设我们徏一个组叫cvsQ用户名是cvsroot。徏l和用户的命令如?/p>
#groupadd cvs
#adduser cvsroot
生成的用户宿ȝ录在/home/cvsrootQ根据自qpȝ调整Q?/p>
2、用cvsroot 用户登陆Q修?/home/cvsroot QCVSROOTQ的权限Q赋与同lh有读写的权限Q
$chmod 771 . Q或?70应该也可以)
注意Q这一部分工作是按照文档说明做的,是否一定需要这h有试验,我会在做试验后在以后版本的教E说得仔l一炏V如果您有这斚w的经验请提供l我Q谢谢?/p>
3、徏立CVS仓库Q(仍然?cvsroot 用户Q,用下面命令:
$cvs -d /home/cvsroot init
4、以rootw䆾登陆Q修?/etc/inetd.confQ?xinetd 的系l没有此文gQ和 /etc/services
如果用的?inetd 的系l,?/etc/inetd.conf 里加入:
cvsserver stream tcp nowait root /usr/bin/cvs cvs -f --allow-root=/home/cvsroot pserver
说明Q上面的行是单独一整行Q?usr/bin/cvs 应该是你的cvs版本的命令\径,h据自qpȝ调整Q?home/cvsroot是你建立的CVSROOT的\径,也请Ҏ上面建立目录的部分的内容做调整?/p>
如果是?xinetd 的系l,需要在 /etc/xinetd.d/ 目录下创建文?cvspserverQ此名字可以自己定义Q,内容如下Q?/p>
# default: on
# description: The cvs server sessions;
service cvsserver
{
socket_type = stream
wait = no
user = root
server = /usr/bin/cvs
server_args = -f --allow-root=/cvsroot pserver
log_on_failure += USERID
only_from = 192.168.0.0/24
}
其中only_from是用来限制访问的Q可以根据实际情况不要或者修攏V修改该文g权限Q?/p>
# chmod 644 cvspserver
?etc/services里加入:
cvsserver 2401/tcp
说明Qcvsserver 是Q意的名称Q但是不能和已有的服务重名,也要和上面修?/etc/inetd.conf 那行的第一一致?/p>
5、添加可以?CVS 服务的用户到 cvs l:
?root w䆾修改 /etc/groupQ把需要?CVS 的用户名加到 cvs l里Q比如我惌用户 laser 和gumpwu 能够使用 CVS 服务Q那么修改以后的 /etc/group 应该有下面这样一行:
cvs:x:105:laser,gumpwu
在你的系l上GID可能不是105Q没有关pR主要是要把laser和gumpwu用逗号分隔开写在最后一个冒号后面。当Ӟ象RedHat{分发版有类似linuxconfq样的工L话,用工具做qg事会更简单些?/p>
6、重起inetd使修改生效:
#killall -HUP inetd
如果使用的是 xinetd 的系l:
# /etc/rc.d/init.d/xined restart
然后察看cvs服务器是否已l运行:
[root@localhost /]# netstat -lnp|grep 2401
tcp 0 0 0.0.0.0:2401 0.0.0.0:* LISTEN 1041/xinetd
则说明cvs服务器已l运行?/p>
二、管理CVS服务?/p>
服务器可以用了,现在大家最兛_的就是如何管理服务器Q比如,我想让一些h有读?或写 CVS 仓库的权限,但是不想l它pȝ权限怎么办呢Q?/p>
不难Q在 cvs 理员用P在我q里?cvsroot 用户Q的家目录里有一?CVSROOT 目录Q这个目录里有三个配|文Ӟpasswd, readers, writersQ我们可以通过讄q三个文件来配置 CVS 服务器,下面分别介绍q几个文件的作用Q?/p>
passwdQcvs 用户的用户列表文Ӟ它的格式很象 shadow 文gQ?/p>
{cvs 用户名}:[加密的口令]:[{效pȝ用户名]
如果你希望一个用户只?cvs 用户Q而不是系l用P那么你就要设|这个文Ӟ刚刚安装完之后这个文件可能不存在Q你需要以 cvs 理员用h工创建,当然要按照上面格式,W二个字D|该用L加密口oQ就是用 crypt (3)加密的,你可以自己写一个程序来做加密,也可以用我介l的h的方法:先创Z个系l用P名字?cvs 用户一P口o是准备l它?cvs 用户口oQ创建完之后?/etc/shadow 把该用户W二个字D|贝过来,然后再把q个用户删除。这个方法对付数量少的用h较方便,Z多就不合适了Q而且q有冲突条g(race condition)的安全隐患,q要 root 权限Q实在不怎么栗不q权益之计而已。写一个小E序q不难,可以?linuxforum 的编E版搜烦一下,有个朋友已经写了一个脓在上面了?/p>
W三个字D就是等效系l用户名Q实际上是赋与一?cvs 用户一个等效的pȝ用户的权限,看下面的例子你就明白它的功能了?/p>
readersQ有 cvs L限的用户列表文g。就是一个一l列表。在q个文g中的用户?cvs只有L限?/p>
writersQ有 cvs 写权限的用户的列表文件。和 readers 一P是一个一l列表。在q个文g中的用户?cvs 有写权限?/p>
上面三个文g在缺省安装的时候可能都不存在,需要我们自己创建,好吧Q现在还是让我们用一个例子来教学吧。假设我们有下面几个用户需要?cvsQ?/p>
laser, gumpwu, henry, betty, anonymous?/p>
其中 laser ?gumpwu 是系l用P?henry, betty, anonymous 我们都不想给pȝ用户权限Qƈ?betty ?anonymous 都是只读用户Q而且 anonymous 更是q口令都没有。那么好Q我们先做一些准备工作,先创Z?cvspub 用户Q这个用L责Q是代表所有非pȝ用户?cvs 用户d cvs 仓库?/p>
#adduser
...
然后~辑 /etc/groupQo cvspub 用户?cvs l里Q同时把其它有系l用h限的用户加到 cvs l里。(见上文)
然后~辑 cvs 理员家目录?CVSROOT/passwd 文gQ加入下面几行:
laser:$xxefajfka;faffa33:cvspub
gumpwu:$ajfaal;323r0ofeeanv:cvspub
henry:$fajkdpaieje:cvspub
betty:fjkal;ffjieinfn/:cvspub
anonymous::cvspub
注意Q上面的W二个字D(分隔Wؓ :Q是密文口oQ你要用E序或者用我的土办法生成?/p>
~辑 readers 文gQ加入下面几行:
anonymous
betty
~辑 writers 文gQ加入下面几行:
laser
gumpwu
henry
注意Qwriters中的用户不能在readers中,要不然不能上传更新文件?/p>
对于使用CVS的用戯修改它的环境变量Q例如laser用户的环境变量,打开/home/laserQlaser的宿ȝ录)下的.bash_profile文gQ加?/p>
CVSROOT=/home/cvsroot
export CVSROOT
用laser登陆可以徏立CVS目Q如果要root使用Q可以修?etc/profile文g?/p>
现在我们各项都设|好了,那么怎么用呢Q我在这里写一个最单的Q估计也是最常用的)命o介绍Q?/p>
首先Q徏立一个新的CVS目Q一般我们都已经有一些项目文件了Q这h们可以用下面步骤生成一个新的CVS目Q?/p>
q入C的已有项目的目录Q比如叫 cvstestQ?/p>
$cd cvstest
q行命oQ?br />
$cvs import -m "this is a cvstest project" cvstest v_0_0_1 start
说明Qimport 是cvs的命令之一Q表C向cvs仓库输入目文g?-m参数后面的字串是描述文本Q随便写些有意义的东西,如果不加 -m 参数Q那么cvs会自动运行一个编辑器Q一般是viQ但是可以通过修改环境变量EDITOR来改成你喜欢用的~辑器。)让你输入信息Qcvstest 是项目名Uͼ实际上是仓库名,在CVS服务器上会存储在以这个名字命名的仓库里。)
v_0_0_1是这个分支的L记。没啥用Q或C常用。)
start 是每?import 标识文g的输入层ơ的标记Q没啥用?br />
q样我们徏立了一个CVS仓库了?/p>
建立CVS仓库的文件夹应该?#8220;q净”的文件夹Q即只包括源码文件和描述的文件加Q而不应该包括~译q的文g代码{!
三、用CVS
winCVS是一个很好的CVS客户端YӞ在http://cnpack.cosoft.org.cn/down/wincvsdailyguide.pdf可以下蝲到这个Y件的使用手册。这里不在赘qC?/p>
四、用CVS理目
本h正在一加公总事该公司ERP目的开发,在没有用CVS的时候,多次出现了由于不同的开发h员修改同一E序Q而导致程序错误,解决版本控制问题q在眉睫?/p>
׃q个目采用Linuxq_下JAVA开发,使用的开发工具Jbulider是支持CVSq行目理的,作ؓȝ序员Q我军_采用CVSq行版本控制Q首先参照上文在Linux服务器上建立了CVS服务Q然后我把我本地的工E文件传x务器?/p>
例如Q我的工E文件在F:\ERP下,我把ERP下的erp.jpx文g、defaultroot文g夹和src文g夹上传至服务?usr/local/erp下,然后登陆Linux服务器,登陆的用hCVS的用P其环境变量要正确Q我的用户名为adminQ?/p>
#cd /usr/local/erp
#cvs import -m "this is a ERP project" erp v_0_0_1 start
q样名ؓerp的CVS仓库徏立了?/p>
之后开发小l的成员可以用winCVS把该目下蝲到本圎ͼ
打开winCVS
点击工具栏Create -> Create a new repository... 弹出H口
在Grenral?br />
Enter the CVSROOT填写admin@192.168.1.9:/home/cvsroot 其中admin是cvs的用P在本例中admin也是linux的系l用P192.168.1.9是服务器的地址Q?home/cvsroot是CVS的主目录Q参考上文?br />
Authentication中选择"passwd file on the cvs server"
Use version中选择cvs 1.10 (Standard)
其它w认即可?/p>
认后,点工hAdmin --> Login... 会提C入密码,输入密码后,看看winCvs的状态栏。如果提C?/p>
*****CVS exited normally with code 0*****
表示d正常?/p>
点击工具栏Create --> Checkout module...弹出对话框,其中的Checkout settings中
Enter the module name and path on the server 填写erpQ即我们建立的名为erp的CVS仓库
Local folder to checkout to 选择要下载到本地的目录,我选了F:\myerp
其它目可以默认Q确定后可以下载到本地了,在F:\myerp\下会有一个erp文g夹,其文件结构和F:\erp下的文gl构是一L?/p>
用Jbulider打开F:\myerp\erp\下的erp.jpx文gQ这个工E文件就可以使用了?/p>
在Jbuilder的工hTeam --> Select Project VCS 弹出对话框,选择CVS
对于你要q行修改的文Ӟ在Project View中点中该文gQ然后点右键Q探出快捯单,选择CVS --> CVS Edit "xxxx.javaQ文件名Q?
W一ơ用可能会提示CVS服务器的密码?/p>
在修改之前还要选择CVS --> Update "xxxx.javaQ文件名Q?
修改之后选择CVS --> Commit "xxxx.javaQ文件名Q?
q样Q修改的文g׃存到CVS服务器了QUpdate的目的是下蝲、比较文件。每ơ在修改之前都UpdateQ保持最新版本?/p>
CVS在项目管理用中实起到了良好的效果Q仔l研ICVS的命令,可以更好的发挥CVS在版本控制上的能力?/p>
我的QQ?0896Q欢q大家来交流Q也可以到我的论坛上讨论 http://www.laoer.com
于是查看CVS的文档,也就?kb参数来设定文件的cd。我切换到命令行方式Q还是一P被识别成Text的了?/p>
于是x一U方式,来解册个问题,否则在之后的工作中会有麻烦的Q其实PowerDesigner的文?pdm的也存在q种情况Q但是至?pdm是真正的文本文gQ即使发生了冲突Q虽然几率较,也是可以在文文本~辑器中修改回来Q但是Visio׃一样了Q?vsd可是真正的Binary的文档啊Q?/p>
看到cvs文档上说Q可以修改cvswrappers文g来设定扩展名对应的处理方式,是Textq是Binary的方式,因ؓCVSq不能准判断你加入的文件的cd?/p>
1. 使用WinCVS客户端或者cvs.exe命o行工h出CVSROOTq个ModuleQ需要注意的是,q个Module的安全界别设|比较高Q需要Administrator或者有Admin权限的用h可以。可以登录到服务器查看一下CVSROOT\CVS\fileattr.xml
2. 修改cvswrappers文gQ里面有单的说明Q在最后加入两行:
*.vsd -kb
*.pdm -kb
如果是其它的CVS版本Q参考cvswrappers文g注释部分的内?/p>
3. Commit 文g cvswrappers
然后可以添?vsd的文件了Q果然能够识别成Binary的了?/p>
上面描述的问题和解决办法?CVSNT 2.5 版本的,
在CVSNT 2.0版本中,如果你Add文g时用Binary方式Q那么之后的操作是以Binary对待了?/p>
其它版本没有环境试了?/p>