也正是由于CVS产生和应用于开源世界,使得它在代码的访问控制方面存在先天性的不Q在应用于大中型的商业项目的代码理中收C定的限制。因cd 的项目通常都需要比较细致的分工Q不同的组分别负责不同模块的开发,代码需要比较严格的讉K控制Q不同的开发h员只能访问授权的代码?/p>
q运的是QCVS是一个开源的软gQ我们有什么需要的话可以通过修改它的源代码来实现。CVSACL是实现讉K控制的CVS补丁。它本n也是一个开源的目Q项目主|http://cvsacl.sourceforge.net/index.html 。它提供了对CVS的模块,目录和文件以及分支和tag的高U访问控制。CVSACL定义?U不同的讉K权限,分别?
权限 | 关键?/p> | 说明 |
没有权限 | n | 用户不能做Q何cvs操作 |
L?/p> | r | 可以执行annotate, checkout, diff, export, log, rannotate, rdiff, rlog, status命o |
写权?/p> | w | 可以执行commit/checkin命o |
tag | t | 可以执行tag/rtag命o,依赖L? |
创徏 | c | 可以执行add import 命o |
删除 | d | 可以执行rm命o |
全部权限 | a | 可以执行所有cvs命o处理cvsacl理命o |
理权限 | p | 可以执行所有命?/p> |
1Q?nbsp; 下蝲CVSACLQ?/p>
通过如下|址可以下蝲到CVSACL相关E序Q目前最新版本是cvsacl-1.2.5Q?/p>
https://sourceforge.net/project/showfiles.php?group_id=75057&package_id=77484&release_id=423655
cvsacl-1.2.5-for-cvs-1.11.22.tar.gz
cvs-1.11.22-cvsacl-1.2.5-patched.tar.gz
2Q?nbsp; 安装CVSACLQ?/p>
安装Ҏ(gu)Qcvs-1.11.22-cvsacl-1.2.5-patched.tar.gz
[root@localhost setup_cvs]# tar -zxvf cvs-1.11.22-cvsacl-1.2.5-patched.tar.gz
//解压~cvs-1.11.22-cvsacl-1.2.5-patched.tar.gz
[root@localhost setup_cvs]# mv cvs-1.11.22-cvsacl-1.2.5-patched cvs-1.11.22
//修改cvs-1.11.22-cvsacl-1.2.5-patched目录名称?cvs-1.11.22
[root@localhost setup_cvs]# cd cvs-1.11.22 //q入cvs-1.11.22
[root@localhost cvs-1.11.22]# ./configure //~译安装
[root@localhost cvs-1.11.22]# make
[root@localhost cvs-1.11.22]# make install
[root@localhost setup_cvs]# cvs –version //查看cvs版本
Concurrent Versions System (CVS) 1.11.22 (client/server)
with CVSACL Patch 1.2.5 (cvsacl.sourceforge.net)
注:不需要特意删除旧版本的CVS?/p>
3Q?nbsp; CVS服务器的配置Q?/p>
Q?Q?修改配置文gQ?/p>
[root@localhost /]# vi /etc/services
查看是否有:
cvspserver 2401/tcp #CVS client/server operations
cvspserver 2401/udp #CVS client/server operations
注:pȝ自带了CVSӞq?行也已经有了Q只需要确认一下。如果没有,误己加上去?
Q?Q?创徏CVS启动脚本Q?/p>
[root@localhost /]# vi /etc/xinetd.d/cvspserver
内容如下Q?/p>
service cvspserver
{
disable = no
flags = REUSE
socket_type = stream
wait = no
user = root
server = /usr/bin/cvs
server_args = -f --allow-root=/home/cvsroot pserver
log_on_success += USERID
log_on_failure += USERID
}
注:其中Qserver指定CVS可执行文件\径,默认安装是/usr/bin/cvsQserver_args指定源代码库路径及认证方式等Q?例子中把源代码存攑֜cvsroot的主目录中,也可以另外指定\径,但必L意权限设|,pserver是密码认证方式,q种方式的安全性要差一些,?操作h比较单。请注意每行{号左右都有一个空|否则无法启动服务?/p>
Q?Q?重新启动xinetd服务Q?/p>
[root@localhost /]# service xinetd restart
查看是否启动Q[root@localhost /]# netstat -l | grep cvspserver
屏幕昄Qtcp 0 0 *:cvspserver *:* LISTEN
说明已经正常启动Q如果没有请做如下检查:
<1>h查vi /etc/xinetd.d/cvspserver文g中的server = /usr/bin/cvs路径和实际执行文件所在位|是否一_(一般这步骤卛_解决该问?
<2>请重新检查配|过E是否有错误或者遗漏;
<3>最后还必须查防火墙的设|,?401端口打开?/p>
4Q?nbsp; CVSACL权限讄Q?/p>
Q?Q?创徏用于CVS的专用系l组和用P
[root@localhost /]# groupadd cvsroot
[root@localhost /]# useradd –g cvsroot cvsadmin
Q?Q?初始化cvs服务器环境:
[root@localhost /]# cvs -d /cvstest init
Q?Q?讄CVS配置库归属及权限Q?/p>
[root@localhost /]# chown –R cvsadmin.cvsroot /cvstest
[root@localhost /]# chmod –R 770 /cvsroot
Q?Q?修改CVSROOT/CVSROOT/aclconfig配置文gQ?/p>
[root@localhost /]# vi /cvstest/CVSROOT/aclconfig
UseSystemGroups=yes 行首d“#”Q表C注释掉?/p>
UseCVSGroup=yes 去除行首?#8220;#”Q表C启用此句?/p>
Q?Q?创徏CVS用户及组Q?/p>
[root@localhost /]# cd /cvstest/CVSROOT
[root@localhost /]# htpasswd –c passwd yueyx
[root@localhost /]# vi passwd
yueyx:*******:cvsadmin
passwd文g中的所有cvs用户映射到同一个系l用户cvsadmin上?/p>
[root@localhost /]# vi group
文g格式Q?/p>
group1:x:1:yueyx,test1
用户之间?“,”分割?/p>
注:cvsacl有个bugQ必dl用h前边d一个不存在的cvs用户Qgroup文g才会生效。原因不明,但此Ҏ(gu)实用?/p>
Q?Q?使用cvsacll化权限Q?/p>
[root@localhost /]# cvs -d /cvstest racl yueyx:wcd –R Project/doc
说明Q?cvstestQ配|库路径 yueyxQ用?wcdQ参见本?#8220;CVSACL定义?U不同的讉K权限”表格?Project Q配|库中的Module(模块)QdocQModule(模块)下的目录
格式Qcvs –d 配置库位|?racl [用户||l?权限] [-Rl] [-r tag] [模块…] [文g…]
- R q行目录递归
- r rev 讑֮版本/标签
- l列出已定义的ACLs权限
1?nbsp; CVSq?/span>
2?nbsp;
CVS服务器的安装
默认情况下,CVS在Redhat Linux中已l安装,q一点可以通过在Linux命o行的情况下运行:
rpm –q
cvs
如果出现CVS的版本信息就证明已经安装成功了?br />
CVS服务器安装包可以从网上的很多地方下蝲Q也可以到CVS的官方网站进行下载。根据你所使用的系l,下蝲相应的版本,然后q行安装。因为我们的目是在Redhat
Linux下用CVS服务器进行版本管理,所以本文将主要ZRedhat
Linuxq行介绍。首先下载CVS服务器的rpm包,当然也可以下载其它方式的包如源程序包Q然后采用以下命令进行安装:
rpm -ivh cvs-1.11.7-1.i386.rpm
3?nbsp; CVS服务器的配置
安装完之后的W一件事是要配|CVS服务器的配置文gQ其能正常的工作。首先在/etc/services文g中添加cvspserverQ其成为Linux的一U服务也是cvs服务器例E的入口Q配|如下:
cvspserver 2401/tcp # cvs client/server
operations
cvspserver 2401/udp # cvs
client/server operations
如果文g中已l存在上面的两行文字Q就不用d了?br />
4?nbsp;
配置xinetdQ用xinetd来启动CVS验证服务器:
q入?etc/xinetd.d/目录Q然后编辑一个文本文Ӟ名字一定要?etc/services中的入口名字cvspserver一_所以这里用cvspserver作ؓ文g名,文g的内容如下所C:
service cvspserver
{
disable = no
flags =
REUSE
socket_type = stream
wait = no
user =
root
server = /usr/bin/cvs
server_args = -f
--allow-root=/usr/cvsroot pserver
log_on_failure +=
USERID
}
~辑文g之后试cvspserver服务是否配置成功?br />
执行
/etc/init.d/xinetd
restart
重新启动服务Q启动成功之后,执行下面的语句,验证服务是否启动正常Q?br />
telnet localhost
2401
如果出现如下字样Q?br />
Trying 127.0.0.1...
Connected to localhost.
Escape
character is '^]'.
输入hiQ会l箋输出如下字样
cvs [pserver aborted]: bad auth protocol
start: hi
Connection closed by foreign
host.
出现以上的现象表CCVS用户验证服务器已l配|成功?br />
如果出现如下字样Q表C配|不成功Q请重新查以上的配置Q?br />
Trying
127.0.0.1...
telnet: connect to address 127.0.0.1: Connection
refused
5?nbsp;
配置CVS用户Q?br />
首先建立一个用LcvsQ可以用groupadd或者addgroup命名Q也可以直接~辑/etc/group文gdq个l,然后d一个用户cvsuserQ?br />
groupadd
cvs
useradd cvsuser –g cvs
passwd
cvsuser
讄新的密码?br />
?usr目录下徏立cvsroot目录Q也可以在其它的目录下徏Q但是应该和cvspserver文g中的选项一_Q然后修?usr/cvsroot的属d属性:
cd
/usr
mkdir cvsroot
chown –R cvsuser.cvs cvsroot
chmod –R 771
cvsroot
6?nbsp;
初始化CVS服务?br />
安装完CVS服务器之后的另一仉要的事情是要初始化CVS服务器的根目录,以后创徏的CVS目都将建立在这个目录下Q采用的命o如下Q?br />
cvs
–d /usr/cvsroot
init
如果没有M提示Q表C初始化成功。初始化成功之后Q会?usr/cvsroot目录中创建CVSROOT目录Q目录中有如下文Ӟ
-r--r--r--
1 root root 493 Apr 5 20:19 checkoutlist
-r--r--r-- 1
root root 693 Apr 5 20:19 checkoutlist,v
-r--r--r-- 1
root root 760 Apr 5 20:19 commitinfo
-r--r--r-- 1 root
root 960 Apr 5 20:19 commitinfo,v
-r--r--r-- 1 root
root 527 Apr 5 20:19 config
-r--r--r-- 1 root root
727 Apr 5 20:19 config,v
-r--r--r-- 1 root root 753 Apr 5
20:19 cvswrappers
-r--r--r-- 1 root root 953 Apr 5 20:19
cvswrappers,v
-r--r--r-- 1 root root 1025 Apr 5 20:19
editinfo
-r--r--r-- 1 root root 1225 Apr 5 20:19
editinfo,v
drwxrwxr-x 2 root root 4096 Apr 5 20:19
Emptydir
-rw-rw-rw- 1 root root 0 Apr 5 20:19
history
-r--r--r-- 1 root root 1141 Apr 5 20:19
loginfo
-r--r--r-- 1 root root 1341 Apr 5 20:19
loginfo,v
-r--r--r-- 1 root root 1151 Apr 5 20:19
modules
-r--r--r-- 1 root root 1351 Apr 5 20:19
modules,v
-r--r--r-- 1 root root 564 Apr 5 20:19
notify
-r--r--r-- 1 root root 764 Apr 5 20:19
notify,v
-r--r--r-- 1 root root 649 Apr 5 20:19
rcsinfo
-r--r--r-- 1 root root 849 Apr 5 20:19
rcsinfo,v
-r--r--r-- 1 root root 879 Apr 5 20:19
taginfo
-r--r--r-- 1 root root 1079 Apr 5 20:19
taginfo,v
-rw-rw-rw- 1 root root 0 Apr 5 20:19
val-tags
-r--r--r-- 1 root root 1026 Apr 5 20:19
verifymsg
-r--r--r-- 1 root root 1226 Apr 5 20:19
verifymsg,v
q样目录/usr/cvsroot成为CVS服务器的根目录,以后创徏的目录都默认的存放在这个目录下?br />
7?nbsp;
dcvs服务器(在Linux或其它Unixpȝ下进行登录的情况Q:
输入如下命oQ?br />
cvs -d
:pserver:cvsuser@localhost:/usr/cvsroot
login
提示输入密码Q输入上面设|的密码Q如果没有Q何提C,p明成功登录了
W一ơ登錄會有cvs login: warning: failed to open /home/cvsuser/.cvspass for reading: No such file or directory似的提CZ?以后登錄׃會有?
d成功之后在当前用L$HOME目录中生?cvspass文gQ可以利用viҎ(gu)件进行察看?br />
׃?#8220;.”开头的文g在Linux中是隐藏的,所以可以利用如下命令进行察看:
ls
–a
q个文g记蝲了用Ld信息。执行注销命o可以删除该文件中的登录信?br />
cvs -d
:pserver:cvsuser@localhost:/usr/cvsroot logout
下面对登录命令的语法q行说明Q?
其中Q?pserver表示采用pserver方式q行用户d认证Q一般的CVS服务器都采用q种方式Q当然也可以采用其它方式Q具体参考相应的资料Q?
:cvsuser表示要登录的用户名,只要是cvsl的成员都可以,如:cvsuserQ?
@host表示要登录的服务器,可以是DNS名,也可以是IP地址Q如Q?92.168.0.1Q?
:/usr/cvsroot表示CVS在服务器上的目录Q也可以是其它目录(q6中你所指定的用来做init初始化的目录军_Q;
提示Q?br />
a、也可以把export
CVSROOT=:pserver:cvsuser@192.168.0.1:/usr/cvsrootq一句直接写在用L初始化文件中Q如Q?bash_profileQ,q样用户每次dӞ只需输入Q?
cvs login
然后输入相应的口令就可以d到cvs服务器上?
b、如果是本地dQ可以直接把export
CVSROOT=/usr/cvsrootq一句写在用L初始化文件如Q?etc/profile中;然后执行如下命o使环境变量生效:
source
/etc/profile
8?nbsp;
向CVSd新的目模块
一般我们都已经有一个或多个目了,q样我们可以用下面步骤生成一个新的CVS目。将一个工E文件置于CVS中进行版本控Ӟ在CVS
术语中称作导?import)。从名字上就可以看出Q在导入前需要ؓ此作些准备工作?br />
输入操作的基本要求是有个"q净"的目录结构?q净"的意思是不需要版本控制的文g都被U走了(如编译生成的文gQ备份文件等{)。如果工E已l开始一D|间了Q这显得很重要。在目录中也许有些是不打将其置于版本控制下的文Ӟ但是又想他们放在这里,q种情况下,你要在输入之前将它们U走Q然后再Ud来?br />
注意的是CVS
认ؓI目录是不存在的。如果想增加一个既不包含文件又不包含子目录的目录,需要在其下创徏一个哑文g。徏议你创徏一个名?README.txt
的文Ӟ其内容ؓ对目录的要说明?br />
q入到已有项目的目录Q比如叫 cvstestQ?br />
cd
/home/cvsuser/cvstest
q行命o项目文件导入到cvs仓库中:
cvs import -m "this is a cvstest
project" cvstest tengtu
start
说明Qimport 是cvs的命令之一Q表C向cvs仓库输入目文gQ?
-m参数后面的字串是描述文本Q对目q行描述Q如果不?-m
参数Q那么cvs会自动运行一个编辑器Q一般是viQ但是可以通过修改环境变量EDITOR来改成你喜欢用的~辑器)让你输入信息Qcvstest
是项目名Uͼ实际上是仓库名,在CVS服务器上会存储在以这个名字命名的仓库里)
tengtu是这个厂商标讎ͼ
start 是每?import
标识文g的输入层ơ的标记?br />
9?nbsp;
从cvs本地服务器上checkout相应的模块:
a、如果是在CVS服务器所在计机上,可以直接采用如下命oQ?
cvs checkout
cvstest
q样把cvstest目模块checkout到当前目录下?
b、如果是在远E运行Linux或其它Unixpȝ上,在第7中登录之后也可以用上边的命o把相应的目模块checkout到当前目录下?
另外Q如果是在windows端进行checkoutQ可以采用WinCVSQ那么还要对WinCVSq行其它的一些配|,下一部分具体介l它的配|方法?
很多时候我们在做项目开发时Q会用到cvsQ现在我l大家介l一下关于eclipse下怎么使用cvs理功能Qeclipse本n是自带cvs的,我们只要单设|一下让?a class="qs_highlight1" id="hl_5" onmouseover="window.clearTimeout(_ht[5]);qs_show_frame(event,this,5);" style="font-size: 1em" onclick="_write_cookie('click33',5);" onmouseout="_on_div[5]=false;_ht[5]=window.setTimeout('qs_is_on_div(5)',500);" target="_blank">q接到cvs服务器上?br />
看下?br />
点击cvs的图标出现此画面后,在空白处点击右键可以,新徏一个资源库位置Q如下图
输入完信息后Q点d成,徏立好了,跟cvs服务器的q接Q下面我们打开cvs服务器上的目?br />
对于cvs服务器上的目录,我们可以出,一U是Zؓ目Q就会将目录出在eclipse中自动生成一个项?
也可以将某个目录出到M一个项目中卟뀔检出到〕这个功能,需?/a>注意的是只有出的文gQ在修改后才可以提交。下面看Ҏ(gu)件的操作Q?br />
对于文g来说Q我们最常用的就是比较cvs中各个版本文件的区别Q方便我们查找更新有没有问题Q点MQ何一个文件点d键就可看C面的囄Q然后我们用在资源历史记录中显C,看到下图Q?br />
我们按住ctrl键点?a class="qs_highlight1" id="hl_6" onmouseover="window.clearTimeout(_ht[6]);qs_show_frame(event,this,6);" style="font-size: 1em" onclick="_write_cookie('click29',6);" onmouseout="_on_div[6]=false;_ht[6]=window.setTimeout('qs_is_on_div(6)',500);" target="_blank">鼠标选择两个版本的文Ӟ然后点击鼠标右键Q点L较就可以比较q个文gq两个版本之间的差异了?br />
下面我们看看怎么h更新cvs服务器上的文Ӟ前面已经讲了Q只有从cvs服务器中出的文g才可以更新和提交Q看下图
?目中选中M一个检出的文gQ点击鼠标右键,选择组Q就可以看到提交和更新等很多功能。你只要更改好后Q点L交就可提交到cvs服务器中Q点L?是从cvs服务器中取文件更新本地文?q里需要注意的是,当我们徏立的目是源代码文g和编译好的类文g是不同目录的时候,是不能传cLӞ传的话会?致cvs服务器上的文件出问题Q只能将cL件单独复制到专门用来上传的目录上传,因ؓ目在编译的时候会原文g下的cvs目录也编译到cL件下Q所以会 Dq个问题?br />
下面Z说一个eclipse本地文g的一个历史记录的功能Q看C图中的比较和替换为,是eclipse一个本地的历史记录功能Q帮助你可以恢复以前或者跟以前的文件比较的功能。看下图
怿大家一看就会明白这个功能?br />
关于eclipseQcvs的基本功能用其实很单,大家试一下就知道Q我在项目中用得最多的都是它的比较功能Q对于文件上传我q是用cvs的客LE序Q因为源代码目录和类文g目录不同Q所以这h?a class="qs_highlight1" id="hl_2" onmouseover="window.clearTimeout(_ht[2]);qs_show_frame(event,this,2);" style="font-size: 1em" onclick="_write_cookie('click150',2);" onmouseout="_on_div[2]=false;_ht[2]=window.setTimeout('qs_is_on_div(2)',500);" target="_blank">安全Q希?br />
q些能对各位使用eclipse中的cvs有所帮助。如有问题欢q指出?br />
Q-大肚?nbsp;
2004.10.9
在第一部分中讲qC一个问题,关于 目在编译的时候会原文g下的cvs目录也编译到cL件下Q所以会D上传cL件出问题。经q这两天的研I?a class="qs_highlight1" id="hl_7" onmouseover="window.clearTimeout(_ht[7]);qs_show_frame(event,this,7);" style="font-size: 1em" onclick="_write_cookie('click230',7);" onmouseout="_on_div[7]=false;_ht[7]=window.setTimeout('qs_is_on_div(7)',500);" target="_blank">发现q个问题是可?a class="qs_highlight1" id="hl_0" onmouseover="window.clearTimeout(_ht[0]);qs_show_frame(event,this,0);" style="font-size: 1em" onclick="_write_cookie('click29',0);" onmouseout="_on_div[0]=false;_ht[0]=window.setTimeout('qs_is_on_div(0)',500);" target="_blank">解决的。方法如下:
点击H口下的首选项看到下图Q?br />
按图上所说的Q已qoCVS目录Q还有就是去掉完全构建时清空文g夹,q样的话在编译文件是׃会将cL件所在的文g夹中的cvs目录删除。做好这两部可以解决问题了?br />
我们在多行一个项目进行开发时Q通常会碰C个问题就是两个h从cvs服务器上同时下蝲了同一个文Ӟq行修改Q当一个h先提交而另一个h后提交时?常就前一个h修改的覆盖掉了,我们看看eclipse中的cvs是怎样处理q个问题的,首先我们从cvs中检Z个目录ؓ目为test然后打开一个文 件test1.txt文g在文件中加了adc如下图:
然后我们用cvs的客LE序下蝲同一个test目录Q然后在test1.txt文g中增加bbbQ这L当于两个人同时修改了同一个文Ӟ我们先提交一个。如下图Q?br />
然后在eclipse中提交同L文gtest1.txtQ如下图
会出C个错误:
q个错误表明了你的提交文件失败了Q我再用另外一个功能,是与资源库同步功能Q在前一张图中可以看刎ͼ点击资源库同步后看到下图Q图中有相应的说?br />
q样你就可以知道W一个更C改了哪里Q更重要是你也可以覆盖提交,或者覆盖更新本地的文gQ看下图Q?br />
?http://www.gispark.com/html/programme/2007/0603/1178.html
?http://bbs.scmlife.com/viewthread.php?tid=1920