Windows下CVS的使用
从VSS到CVS
为什么要使用CVS
* CVS支持真正的Client/Server模式,也支持Client/File模式,VSS仅支持Client/File模式。所以CVS可以在Internet上发布文件,而VSS只能可以工作在局域网上。
* CVS支持UNIX和Windows平台。VSS仅支持windows平台。
在Windows平台配置CVS pserver
首先在http://www.cvsnt.org/wiki下载最新的CVSNT的安装文件,然后依照屏幕提述安装。CVSNT把CVS server配置成Windows的服务:CVSNT和CVS Locking Service。安装成功之后,这两个服务应该都已经启动。
设定CVS库
打开“开始/程序/CVSNT/Service control panel”,并打开Repositories选项页。
选择Add,这是出现Add对话框。可以选择…来定位cvs库的位置,比如“C:/cvsroot”。选择OK。
设定登录和其他事项
选择Advanced选项卡。在“Use local users for pserver authentication instead of domain users”上打勾,表示可用本地用户登录。在“Pretend to be a Unix CVS version”上打勾,这可以和Unix上的CVS pserver保持兼容。
这样,整个server就配置好了,可以重起这两个服务使配置更改生效。
测试
在命令行上面输入以下语句:
cvs –d:pserver:127.0.0.1:2401/cvsroot login
其中的“/cvsroot”是前面设定的Repositories。为了符合UNIX的命名习惯,原来的“C:/cvsroot”映射成了“/cvsroot”。根据屏幕提示输入密码,如果没有错误,那么恭喜,你的CVS server启动成功。你也可以在一台UNIX机器上输入以上命令(记得把127.0.0.1改成CVS服务器的IP)。
在VC.net上集成CVS
目前有一个工具可以把CVS集成到VC.net,但不是免费的。一个license要$19,是个俄罗斯的公司开发的。如果想要尝试一下,可以到http://www.pushok.com/soft_download.php下载CVS_SCC_Proxy评估版,30天的使用期。不过很有意思的是,到期之后可以换个名再去申请一个license。这和免费好像没有多大差别。
安装
下载完毕按照屏幕提示安装即可。安装完成之后需要注册,申请一个评估的license就可以用起来了.
安装完成之后,VC.net的默认的源代码管理就是CVS了,如果你想恢复到VSS,可选择“开始/程序/PushOK Software/CVSSCC/Switch SCC”。然后就在系统的右下侧的系统托盘里右键点击图标,出现下面的菜单。选择“Microsoft Visual SourceSafe”即可恢复。
将VC.net解决方案添加到CVS
如果已经有一个VC.net解决方案,可以选择更改源代码设置。
选择“绑定”之后,系统弹出绑定对话框。
如果使用上面建立的CVS pserver,在CVSROOT填上:pserver:user@127.0.0.1:2401/cvsroot,把“user”换成你的本地帐户。填完之后,可以点击旁边的Check按钮检查一下有效性。点击Login按钮登录一下,看看是否成功。
在CVS MODULE里填上模块的名称,这可以是一个路径,中间用“/”隔开。填完之后Check一下是否存在,不存在的话,点击Create创建一个。这时可以点击CVS MODULE旁边的…按钮,察看一下CVS的结构。
在VC.net中使用
CVS_SCC_Proxy遵循微软的SCC标准,使用起来和VSS差别不大。
和资源管理器集成
TortoiseCVS实现了和资源管理器的集成,而且是个开源软件。
特性
如果一个文件或文件夹受CVS管理,会在资源管理器里显示为绿色。在上面点击右键,会出现有关CVS的菜单。TortoiseCVS在上面加了有关CVS的菜单。
安装
可在http://sourceforge.net/projects/tortoisecvs下载TortoiseCVS的最新版本。按照屏幕提示安装即可。另外, TortoiseCVS还有一个CVS的VC.net plugin,目前正在开发中,也挺不错的,而且是免费的。有兴趣的可到http://sourceforge.net/projects/cvssccplugin下一个试试。
命令行使用CVS
常用的命令
在运行下面的命令前,需要设定了CVSROOT环境变量。比如CVSROOT=:pserver:user@172.20.9.27:2401/cvsroot,其中pserver表示连接的是一个认证服务,user代表用户名,172.20.9.27代表服务器的IP,2401代表端口号,/cvsroot表示库的位置。
如果没有设定CVSROOT环境变量,需要在下面的每个命令中在cvs和命令字之间加上-d参数,如:
cvs –d :pserver:user@172.20.9.27:2401/cvsroot login
下面的命令在TortoiseCVS里都有相应的菜单,使用起来更加方便。
登录与注销
CVS pserver需要登录,所以在做任何操作之前,必须登录服务器。
cvs login
登录成功之后,cvs会在$HOME/.cvspass(UNIX)或注册表(NT)中添加登录信息(其实就是用户名和散列处理过的密码,进行下面的操作的时候就用这个散列密码认证)。
注销的时候使用
cvs logout
cvs会把登录的信息删去。
创建项目
cvs import –m “这是注释” proj/web redhat linux
-m “这是注释” 是注释
proj/web是CVS库中的目录
redhat和linux分别是vendor tag(厂商标记)和release tag(发布标记),我也不知道什么意思,但是既然import命令需要他们,就把他们加上。
这个命令就把web项目加到了CVS库中的proj/web目录。
签出项目
在一个工作目录,运行下面的命令:
cvs checkout –d proj/web
-d: :pserver:user@127.0.0.1:/cvsroot 指定CVS库的位置(127.0.0.1:/cvsroot)、认证方法(pserver)、用户名(user);
checkout 表示签出命令
-d web 表示要放到web目录
proj/web 表示要签出的项目在库中的位置
这个命令把CVS库中的Develop/iES-CCS/web目录签出到了web目录。
更新项目
在web目录运行下面的命令
cvs update
cvs会更新每个文件的状态,显示哪些文件作了改变。和”Get latest version”,如果库中的文件有了变化,cvs会把变化合并到本地文件。如果出现冲突,比如同时编辑了一个行代码,cvs会在发生冲突的文件里面标出冲突的地方,并发出警告。
cvs server: Updating .
RCS file: /cvsroot/proj/web/main.cpp,v
retrieving revision 1.1
retrieving revision 1.2
Merging differences between 1.1 and 1.2 into main.cpp
rcsmerge: warning: conflicts during merge
cvs server: conflicts found in main.cpp
C main.cpp
这时,main.cpp文件中发生冲突的地方会有一个标记
<<<<<<< main.cpp
// 当前的版本
=======
// 库中的版本
>>>>>>> 1.2
解决冲突之后,就可以运行一下update:
cvs server: Updating .
M main.cpp
提交更改
在web目录运行下面的命令
cvs commit
和checkin差不多。在提交更改之前,需要运行一下update更新状态。如果不更新,本地文件和库中的文件不一致的话,命令就会失败,提示更新状态:
cvs commit: Examining .
cvs server: Up-to-date check failed for `main.cpp'
cvs [server aborted]: correct above errors first!
释放签出
如果更改完成,想删掉本地文件,用一个安全的方法就是释放签出命令。在web的父目录下运行下面的命令:
cvs release –d web
cvs会检查有没有未提交的更改,然后提示是否真的要删除目录:
You have [1] altered files in this repository.
Are you sure you want to release (and delete) directory `web':
常用过程
首先签出项目,然后做一些更改。如果觉得可以了,就可以更新文件,看看有没有冲突。有冲突就解决冲突。然后提交更改。最后释放签出。
CVS 库的存储结构
VSS可以显示库的结构,CVS没有这样的工具。但是,由于CVS存放的结构和库的结构是一致的,所以可以通过浏览CVS的目录结构来查看库的结构。下面是一个库的存储结构。
/usr
|
+--local
| |
| +--cvsroot
| | |
| | +--CVSROOT
| (administrative files)
|
+--gnu
| |
| +--diff
| | (source code to gnu diff)
| |
| +--rcs
| | (source code to rcs)
| |
| +--cvsnt
| (source code to cvsnt)
|
+--yoyodyne
|
+--tc
| |
| +--man
| |
| +--testing
|
+--(other Yoyodyne software)
库中的文件既保存着文件的内容,又保存着文件的修订历史,文件名是在原有的文件名后面加上,v的后缀。
$CVSROOT
|
+--yoyodyne
| |
| +--tc
| | |
+--Makefile,v
+--backend.c,v
+--driver.c,v
+--frontend.c,v
+--parser.c,v
+--man
| |
| +--tc.1,v
|
+--testing
|
+--testpgm.t,v
+--test2.t,v
CVS的访问控制是通过操作系统提供的安全访问控制机制实现的。对库中的目录设定不同的访问控制,就能控制用户对库的访问。如果设定web只能被user修改,那么除了user以外的用户都不能提交更改。