SlideShare a Scribd company logo
1 of 14
【转】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 FilesNetworkSimplicitysshssh.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 Filesed16iExamDiff.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/Concurre
nt_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

再编辑

引用通告

TrackBack URL for this entry:
如果您想引用这篇文章到您的 Blog,
请复制下面的链接,并放置到您发表文章的相应界面中。
http://www.chedong.com/cgi-bin/mt/trackback.cgi/1003. 1413112852

以下是前来引用的链接: CVS 使用手册:

» [GTD]: Getting Things Done! 搞定 来自 车东[Blog^2]
无论是工作还是生活中很多人都遇到过时间/事务管理的问题,有的朋友会问:有没有能将... [阅读更多细节]

引用时间: November 9, 2007 09:58 AM

» WinCVS 中文版及中文使用手册 来自 csdnexpert
WinCVS 是 CVS 的一个客户端程序,它以 CVS 作为基础,在其上构造了功能强大的 GUI,使得 Windows 平台
上的 CVS 用户可以轻而易举的进行协同工作!W... [阅读更多细节]

引用时间: December 17, 2007 10:38 AM

» WinCVS 中文版及中文使用手册 来自 techcrunch
WinCVS 是 CVS 的一个客户端程序,它以 CVS 作为基础,在其上构造了功能强大的 GUI,使得 Windows 平台
上的 CVS 用户可以轻而易举的进行协同工作! ... [阅读更多细节]

引用时间: January 3, 2008 12:46 PM
» WinCVS 中文版及中文使用手册 来自 itkbase
WinCVS 是 CVS 的一个客户端程序,它以 CVS 作为基础,在其上构造了功能强大的 GUI,使得 Windows 平台
上的 CVS 用户可以轻而易举的进行协同工作! ... [阅读更多细节]

引用时间: January 3, 2008 02:45 PM

» svn diff 版本如何忽略空格 来自 车东[Blog^2]
最近才了解并开始使用 svn ,其实和 cvs 的操作还是略有一些差别的。cvs 其实很... [阅读更多细节]

引用时间: January 9, 2008 01:04 AM

More Related Content

Similar to 【转】CVS使用手册

香港六合彩 » SlideShare
香港六合彩 » SlideShare香港六合彩 » SlideShare
香港六合彩 » SlideSharehfqsnosg
 
Cent os 安装 subversion
Cent os 安装 subversionCent os 安装 subversion
Cent os 安装 subversionYUCHENG HU
 
Subversion简明教程
Subversion简明教程Subversion简明教程
Subversion简明教程Liang
 
Mecurial hg
Mecurial hgMecurial hg
Mecurial hgiaiyang
 
Centos下安装apache + subversion
Centos下安装apache + subversionCentos下安装apache + subversion
Centos下安装apache + subversionYiwei Ma
 
Osvn client 簡介
Osvn client 簡介Osvn client 簡介
Osvn client 簡介catonchuang
 
OpenCV 2.4.2在codeblocks 10.05的環境設定
OpenCV 2.4.2在codeblocks 10.05的環境設定OpenCV 2.4.2在codeblocks 10.05的環境設定
OpenCV 2.4.2在codeblocks 10.05的環境設定菌 細
 
Windows 與 Azure 的容器旅程 @ Ignite Mini 2016
Windows 與 Azure 的容器旅程 @ Ignite Mini 2016Windows 與 Azure 的容器旅程 @ Ignite Mini 2016
Windows 與 Azure 的容器旅程 @ Ignite Mini 2016Jeff Chu
 
[圣思园][Java SE]Websphere.application.developer(wsad)使用外置win cvs解决方案
[圣思园][Java SE]Websphere.application.developer(wsad)使用外置win cvs解决方案[圣思园][Java SE]Websphere.application.developer(wsad)使用外置win cvs解决方案
[圣思园][Java SE]Websphere.application.developer(wsad)使用外置win cvs解决方案ArBing Xie
 
Subversion
SubversionSubversion
Subversioni7Xh
 
ASP.NET MVC 6 新功能探索
ASP.NET MVC 6 新功能探索ASP.NET MVC 6 新功能探索
ASP.NET MVC 6 新功能探索Will Huang
 
Subversion备份服务器的创建
Subversion备份服务器的创建Subversion备份服务器的创建
Subversion备份服务器的创建shadowfalao
 
Asp.net 5 新功能與變革
Asp.net 5 新功能與變革Asp.net 5 新功能與變革
Asp.net 5 新功能與變革Gelis Wu
 
从Docker到容器服务
从Docker到容器服务从Docker到容器服务
从Docker到容器服务Li Yi
 
Axis1.4 开发指南 V1.0
Axis1.4 开发指南 V1.0Axis1.4 开发指南 V1.0
Axis1.4 开发指南 V1.0yiditushe
 
Scrum gathering 2012 shanghai 精益与持续改进分会场演讲话题: 大型企业ci平台建设和实施分享(陈小光)
Scrum gathering 2012 shanghai  精益与持续改进分会场演讲话题: 大型企业ci平台建设和实施分享(陈小光)Scrum gathering 2012 shanghai  精益与持续改进分会场演讲话题: 大型企业ci平台建设和实施分享(陈小光)
Scrum gathering 2012 shanghai 精益与持续改进分会场演讲话题: 大型企业ci平台建设和实施分享(陈小光)LetAgileFly
 
自由軟體鑄造場_20111023_Subversion版本控制系統之操作_曾義峰(ant)
自由軟體鑄造場_20111023_Subversion版本控制系統之操作_曾義峰(ant)自由軟體鑄造場_20111023_Subversion版本控制系統之操作_曾義峰(ant)
自由軟體鑄造場_20111023_Subversion版本控制系統之操作_曾義峰(ant)OpenFoundry
 
Workflow Overview
Workflow OverviewWorkflow Overview
Workflow OverviewKevin Cao
 

Similar to 【转】CVS使用手册 (20)

香港六合彩 » SlideShare
香港六合彩 » SlideShare香港六合彩 » SlideShare
香港六合彩 » SlideShare
 
Cent os 安装 subversion
Cent os 安装 subversionCent os 安装 subversion
Cent os 安装 subversion
 
Cvs
CvsCvs
Cvs
 
Subversion简明教程
Subversion简明教程Subversion简明教程
Subversion简明教程
 
Mecurial hg
Mecurial hgMecurial hg
Mecurial hg
 
Centos下安装apache + subversion
Centos下安装apache + subversionCentos下安装apache + subversion
Centos下安装apache + subversion
 
Osvn client 簡介
Osvn client 簡介Osvn client 簡介
Osvn client 簡介
 
OpenCV 2.4.2在codeblocks 10.05的環境設定
OpenCV 2.4.2在codeblocks 10.05的環境設定OpenCV 2.4.2在codeblocks 10.05的環境設定
OpenCV 2.4.2在codeblocks 10.05的環境設定
 
Windows 與 Azure 的容器旅程 @ Ignite Mini 2016
Windows 與 Azure 的容器旅程 @ Ignite Mini 2016Windows 與 Azure 的容器旅程 @ Ignite Mini 2016
Windows 與 Azure 的容器旅程 @ Ignite Mini 2016
 
1~60
1~601~60
1~60
 
[圣思园][Java SE]Websphere.application.developer(wsad)使用外置win cvs解决方案
[圣思园][Java SE]Websphere.application.developer(wsad)使用外置win cvs解决方案[圣思园][Java SE]Websphere.application.developer(wsad)使用外置win cvs解决方案
[圣思园][Java SE]Websphere.application.developer(wsad)使用外置win cvs解决方案
 
Subversion
SubversionSubversion
Subversion
 
ASP.NET MVC 6 新功能探索
ASP.NET MVC 6 新功能探索ASP.NET MVC 6 新功能探索
ASP.NET MVC 6 新功能探索
 
Subversion备份服务器的创建
Subversion备份服务器的创建Subversion备份服务器的创建
Subversion备份服务器的创建
 
Asp.net 5 新功能與變革
Asp.net 5 新功能與變革Asp.net 5 新功能與變革
Asp.net 5 新功能與變革
 
从Docker到容器服务
从Docker到容器服务从Docker到容器服务
从Docker到容器服务
 
Axis1.4 开发指南 V1.0
Axis1.4 开发指南 V1.0Axis1.4 开发指南 V1.0
Axis1.4 开发指南 V1.0
 
Scrum gathering 2012 shanghai 精益与持续改进分会场演讲话题: 大型企业ci平台建设和实施分享(陈小光)
Scrum gathering 2012 shanghai  精益与持续改进分会场演讲话题: 大型企业ci平台建设和实施分享(陈小光)Scrum gathering 2012 shanghai  精益与持续改进分会场演讲话题: 大型企业ci平台建设和实施分享(陈小光)
Scrum gathering 2012 shanghai 精益与持续改进分会场演讲话题: 大型企业ci平台建设和实施分享(陈小光)
 
自由軟體鑄造場_20111023_Subversion版本控制系統之操作_曾義峰(ant)
自由軟體鑄造場_20111023_Subversion版本控制系統之操作_曾義峰(ant)自由軟體鑄造場_20111023_Subversion版本控制系統之操作_曾義峰(ant)
自由軟體鑄造場_20111023_Subversion版本控制系統之操作_曾義峰(ant)
 
Workflow Overview
Workflow OverviewWorkflow Overview
Workflow Overview
 

More from wensheng wei

你会柔软地想起这个校园
你会柔软地想起这个校园你会柔软地想起这个校园
你会柔软地想起这个校园wensheng wei
 
几米语录(1)
几米语录(1)几米语录(1)
几米语录(1)wensheng wei
 
Installation of Subversion on Ubuntu,...
Installation of Subversion on Ubuntu,...Installation of Subversion on Ubuntu,...
Installation of Subversion on Ubuntu,...wensheng wei
 
高级PHP应用程序漏洞审核技术
高级PHP应用程序漏洞审核技术高级PHP应用程序漏洞审核技术
高级PHP应用程序漏洞审核技术wensheng wei
 
存储过程编写经验和优化措施
存储过程编写经验和优化措施存储过程编写经验和优化措施
存储过程编写经验和优化措施wensheng wei
 
CentOS5 apache2 mysql5 php5 Zend
CentOS5 apache2 mysql5 php5 ZendCentOS5 apache2 mysql5 php5 Zend
CentOS5 apache2 mysql5 php5 Zendwensheng wei
 
Happiness is a Journey
Happiness is a JourneyHappiness is a Journey
Happiness is a Journeywensheng wei
 
Java JNI 编程进阶
Java JNI 编程进阶     Java JNI 编程进阶
Java JNI 编程进阶 wensheng wei
 
Linux Shortcuts and Commands:
Linux Shortcuts and Commands:Linux Shortcuts and Commands:
Linux Shortcuts and Commands:wensheng wei
 
Java正则表达式详解
Java正则表达式详解Java正则表达式详解
Java正则表达式详解wensheng wei
 
Linux Security Quick Reference Guide
Linux Security Quick Reference GuideLinux Security Quick Reference Guide
Linux Security Quick Reference Guidewensheng wei
 
Android模拟器SD Card映像文件使用方法
Android模拟器SD Card映像文件使用方法Android模拟器SD Card映像文件使用方法
Android模拟器SD Card映像文件使用方法wensheng wei
 
如何硬盘安装ubuntu8.10
如何硬盘安装ubuntu8.10如何硬盘安装ubuntu8.10
如何硬盘安装ubuntu8.10wensheng wei
 
数据库设计方法、规范与技巧
数据库设计方法、规范与技巧数据库设计方法、规范与技巧
数据库设计方法、规范与技巧wensheng wei
 
揭秘全球最大网站Facebook背后的那些软件
揭秘全球最大网站Facebook背后的那些软件揭秘全球最大网站Facebook背后的那些软件
揭秘全球最大网站Facebook背后的那些软件wensheng wei
 
mysql的字符串函数
mysql的字符串函数mysql的字符串函数
mysql的字符串函数wensheng wei
 

More from wensheng wei (20)

你会柔软地想起这个校园
你会柔软地想起这个校园你会柔软地想起这个校园
你会柔软地想起这个校园
 
几米语录(1)
几米语录(1)几米语录(1)
几米语录(1)
 
我的简历
我的简历我的简历
我的简历
 
Installation of Subversion on Ubuntu,...
Installation of Subversion on Ubuntu,...Installation of Subversion on Ubuntu,...
Installation of Subversion on Ubuntu,...
 
高级PHP应用程序漏洞审核技术
高级PHP应用程序漏洞审核技术高级PHP应用程序漏洞审核技术
高级PHP应用程序漏洞审核技术
 
存储过程编写经验和优化措施
存储过程编写经验和优化措施存储过程编写经验和优化措施
存储过程编写经验和优化措施
 
CentOS5 apache2 mysql5 php5 Zend
CentOS5 apache2 mysql5 php5 ZendCentOS5 apache2 mysql5 php5 Zend
CentOS5 apache2 mysql5 php5 Zend
 
Happiness is a Journey
Happiness is a JourneyHappiness is a Journey
Happiness is a Journey
 
Java JNI 编程进阶
Java JNI 编程进阶     Java JNI 编程进阶
Java JNI 编程进阶
 
Linux Shortcuts and Commands:
Linux Shortcuts and Commands:Linux Shortcuts and Commands:
Linux Shortcuts and Commands:
 
Java正则表达式详解
Java正则表达式详解Java正则表达式详解
Java正则表达式详解
 
Linux Security Quick Reference Guide
Linux Security Quick Reference GuideLinux Security Quick Reference Guide
Linux Security Quick Reference Guide
 
issue35 zh-CN
issue35 zh-CNissue35 zh-CN
issue35 zh-CN
 
Android模拟器SD Card映像文件使用方法
Android模拟器SD Card映像文件使用方法Android模拟器SD Card映像文件使用方法
Android模拟器SD Card映像文件使用方法
 
Subversion FAQ
Subversion FAQSubversion FAQ
Subversion FAQ
 
如何硬盘安装ubuntu8.10
如何硬盘安装ubuntu8.10如何硬盘安装ubuntu8.10
如何硬盘安装ubuntu8.10
 
ubunturef
ubunturefubunturef
ubunturef
 
数据库设计方法、规范与技巧
数据库设计方法、规范与技巧数据库设计方法、规范与技巧
数据库设计方法、规范与技巧
 
揭秘全球最大网站Facebook背后的那些软件
揭秘全球最大网站Facebook背后的那些软件揭秘全球最大网站Facebook背后的那些软件
揭秘全球最大网站Facebook背后的那些软件
 
mysql的字符串函数
mysql的字符串函数mysql的字符串函数
mysql的字符串函数
 

【转】CVS使用手册

  • 1. 【转】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
  • 2. 初始化: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
  • 3. 添加文件 创建好新文件后,比如: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 同步。
  • 4. 项目发布导出不带 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 服务器相应同名帐号了。
  • 5. 比如: 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 );
  • 6. 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 注释用 /** 开始的区别
  • 7. /* * Copyright (c) 2002 MyCompany Name. * $Header$ */ package com.mycompany; import java.; /** * comments here */ public class Default { /** * Comments here * @param * @return */
  • 8. 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...
  • 9. 对于 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 FilesNetworkSimplicitysshssh.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 Filesed16iExamDiff.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 讨论组功能。
  • 10. 这里首先说一下 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
  • 11. #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
  • 12. 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/Concurre nt_Versions_System/
  • 13. 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 再编辑 引用通告 TrackBack URL for this entry: 如果您想引用这篇文章到您的 Blog, 请复制下面的链接,并放置到您发表文章的相应界面中。 http://www.chedong.com/cgi-bin/mt/trackback.cgi/1003. 1413112852 以下是前来引用的链接: CVS 使用手册: » [GTD]: Getting Things Done! 搞定 来自 车东[Blog^2] 无论是工作还是生活中很多人都遇到过时间/事务管理的问题,有的朋友会问:有没有能将... [阅读更多细节] 引用时间: November 9, 2007 09:58 AM » WinCVS 中文版及中文使用手册 来自 csdnexpert WinCVS 是 CVS 的一个客户端程序,它以 CVS 作为基础,在其上构造了功能强大的 GUI,使得 Windows 平台 上的 CVS 用户可以轻而易举的进行协同工作!W... [阅读更多细节] 引用时间: December 17, 2007 10:38 AM » WinCVS 中文版及中文使用手册 来自 techcrunch WinCVS 是 CVS 的一个客户端程序,它以 CVS 作为基础,在其上构造了功能强大的 GUI,使得 Windows 平台 上的 CVS 用户可以轻而易举的进行协同工作! ... [阅读更多细节] 引用时间: January 3, 2008 12:46 PM
  • 14. » WinCVS 中文版及中文使用手册 来自 itkbase WinCVS 是 CVS 的一个客户端程序,它以 CVS 作为基础,在其上构造了功能强大的 GUI,使得 Windows 平台 上的 CVS 用户可以轻而易举的进行协同工作! ... [阅读更多细节] 引用时间: January 3, 2008 02:45 PM » svn diff 版本如何忽略空格 来自 车东[Blog^2] 最近才了解并开始使用 svn ,其实和 cvs 的操作还是略有一些差别的。cvs 其实很... [阅读更多细节] 引用时间: January 9, 2008 01:04 AM