CVS RCS HOWTO 原始程式码版本控制系统 (1)
2024-07-26 00:30:59
供稿:网友
 
作者:Al Dev (Alavoor Vasudevan) alavoor@yahoo.com 
译者:Cyril Huang cyril_huang@yahoo.com 
v7.0, 20 Feb 2000 翻译日期: 5 APRil 2000  
-------------------------------------------------------------------------------- 
这份文件是一份 "实际操作的说明" ,以便於能使您很快的设定 CVS/RCS 原始程式码控制系统。这份文件里也有一些将 CVS 上常用的混合命令包成可设定的 shell scripts 。这些 scripts 为 CVS 提供了一个简单的使用者介面。这份文件的内容不仅能适用於 linux 系统也适用於其他像 Unix 的系统,例如Solaris, HPUX, AIX, SCO, Sinix, BSD, SCO 等等。  
-------------------------------------------------------------------------------- 
     
-------------------------------------------------------------------------------- 
1. 简介 
原始码控制系统是一个必须能管理那些在软体计划发展时原始码所做的改变。软体开发者需要一个完整的原始码改变历史纪录,以便於在发生问题时,能够追溯到以前稳定的版本。既然原始程式码对於任何的软体计划与开发,都是花时间与金钱中最关键的部分,所以花时间藉由使用原始码控制系统像 CVS 和 RCS 来安全的保护(safe-guarding)原始程式码是非常重要的。  
CVS (Concurrent Version Control System) 是一个能让很多程式开发者同时做软体开发的非常强大工具。它使用了RCS 的档案规定格式但多了一层像应用程式介面的包装,架在 RCS 的上层。  
(译注: RCS 是较老的版本控制,一个受 RCS 管制的档案看起来是这样子的 proj1.c,v ,CVS 沿用了一些 RCS 的规定。)  
CVS 能够纪录你的档案的历史纪录( 通常是原始程式码,但是其他型态的档案则不一定)。 CVS 只存了不同版本中档案的差异,而不是你所建立的每个版本中的每个档案。 CVS 也保持了一个何时,何人更改档案,为什麽更改档案等等不同观点的历史纪录。  
CVS 对於软体的发行和多人同时更改目前原始码的管理是非常的有帮助。他并不只是要对单一目录下的档案提供版本控制,相反的,CVS 更提供了多层有组织的目录档案的版本控制。在这个目录下除了你的原始程式码外,还包含有一个 CVS 所建立的改版控制目录与档案。  
这些目录与档案最後被合并在一起形成一个软体的发行。  
CVS 能被使用在 "C", "C++", java, Perl, HTML 和其他档案。  
-------------------------------------------------------------------------------- 
-------------------------------------------------------------------------------- 
2. 那一种版本控制系统适合我? CVS 或 RCS 
CVS 实际上是架在 RCS 之上的, CVS 只是一堆更强大能控制一个有完整原始程式码阶层目录的工具。我们非常强烈的推荐您使用 CVS,因为您能够很有弹性的用 perl , korn bash shell 等 scripts 语言设定您自己的 CVS 系统。请看一些 korn shell scripts 的□例 Shell Scripts 。  
CVS 的优点  
CVS 是非集中式的管理,使用者从储存柜 (repository) 登出一个档案目录,并且有他自己的独立的稳定目录树。  
CVS 能够在发行整个计划的原始目录树中"盖上印记" ("STAMP")。  
CVS 能够使大家同时修改档案。  
CVS 能够用 shell scripts 或 perl 设定成档案锁住成单一使用或同时修改档案模式。  
CVS 的缺点  
需要比 RCS 多一点的管理。  
非常成熟复杂的系统,是目前应用上已有的最高技术。(感谢网友tsaipaw@mars.seed.net.tw来信指证我的错误)  
有丰富的命令还有命令选项,因此对於初学者来说有很陡的学习曲线。简单使用的 shell scripts 可在这里找到 Shell Scripts 。  
RCS 的优点  
RCS 非常容易设定。较少一些管理上的工作。  
RCS 用在一个每个人在一起工作的集中区域。  
RCS 对於简单的系统很有用。  
非常严谨的单一档案修改模式 - 同步与同时是不允许的。  
RCS 的缺失  
由於使用单一目录控制与档案锁住,不可能由很多的程式设计者做同时的开发。因为单一目录下很多人对档案的改变,会造成 make 的使用错误。  
不能对整个软体计划戳上发行(releases)的印记。  
这份文件也包含一些 shell scripts 以提供简单的命令来作登出 (check-out), 登录 (check-in), 送交(commit) 档案的动作。请看一些 shell scripts 的□例 Shell Scripts 。  
对於 RCS 而言,请看 Linux CD-ROM 里面的RCS mini-howto。  
-------------------------------------------------------------------------------- 
cd /mnt/cdrom/Redhat/RPMS 
ls -l howto-6.0-*.noarch.rpm 
rpm -qpl howto-6* | grep -i rcs  
-------------------------------------------------------------------------------- 
或者看 http://sunsite.unc.edu/LDP/HOWTO/mini/RCS-HOWTO.html 
-------------------------------------------------------------------------------- 
     
-------------------------------------------------------------------------------- 
3. 设定 CVS  
首先,你需要安装 CVS 套件,在Redhat Linux 上请用  
-------------------------------------------------------------------------------- 
cd /mnt/cdrom/Redhat/RPMS 
rpm -i rcs*.rpm 
rpm -i cvs*.rpm 
To see the list of files installed do - 
rpm -qpl cvs*.rpm | less 
-------------------------------------------------------------------------------- 
然後用 j, k, CTRL+f, CTRL+D, CTRL+B, CTRL+U 或上下左右键, page up/down 浏览一下结果。请用 'man less' 查看 less 的用法  
在其他的 unix 机器上,你可能需要下载 RCS CVS 的 tar.gz 档案,然後根据 README, INSTALL 档的指示来安装 CVS。请到 http://www.cyclic.com 和 http://www.loria.fr/~molli/cvs-index.html 
3.1 CVS 的专有环境变数  
下列的环境变数需要在 /etc/profile 档中设定,/etc/profile 是对所有使用者都有效的内定值设定档,如果没有设定 /etc/profile,那麽你应该加这些设定到你自己的设定档  /.bash_profile 内。  
-------------------------------------------------------------------------------- 
export EDITOR=/bin/vi 
export CVSROOT=/home/cvsroot 
export CVSREAD=yes 
-------------------------------------------------------------------------------- 
建造一个目录来存你原始程式码的储藏柜 (repository) 并且给予 unix group 与 user 读写的权力。 (译注:这个目录下将会有很多你将来的原始码。)  
-------------------------------------------------------------------------------- 
export CVSROOT=/home/cvsroot 
mkdir $CVSROOT 
chmod o-rwx $CVSROOT 
chmod ug+rwx $CVSROOT 
-------------------------------------------------------------------------------- 
要初始化你的 CVS ,并且从现在开始把你的原始程式码交给 CVS 管理。请做 -  
-------------------------------------------------------------------------------- 
cvs init 
(译注;这个初始化的动作在於建造一个储藏柜,是一个目录$CVSROOT/。 
同时 $CVSROOT/CVSROOT 也在此时被建造,这个模组目录下面是控制你CVS的administration files, 
里面的档案做一些修改後,可以使CVS更强大好用。 
$CVSROOT 下的目录每个都是 module 的意思,一个 module 可以就是一个专案计划。 
但也可能是你把一个计划拆成很多 module ,不同 module 交给不同的 team 去发展。) 
# 一定要换到想要 CVS 控制的计划目录下喔 
cd $HOME/my_source_code_dir 
# 把整个目录纳入管理用 import 命令 
cvs import my_source_code_dir V1_0 R1_0   
(译注:其实是 cd 到你的project下後,cvs import 模组 vendor_tag release_tag, 
不一定要是目录名称 my_source_code_dir,vendor_tag, release_tag 只是识别用的东西, 
将来你可以用 tag 来存取你要的特定版本 
这个动作会在 $CVSROOT/ 下开个" 模组 "的目录,然後把 my_source_code_dir 整个放到 CVS 下管理, 
$HOME/my_source_code_dir 就没用了。import 的动作是把已经写好的一堆 code 摆进来, 
如果将来想新增档案xxxx.c,必须先写好xxxx.c,再用 cvs add xxxx.c) 
-------------------------------------------------------------------------------- 
3.2 从 RCS 转换到 CVS 系统  
要转换已经存在的 RCS 档案到 CVS ,请使用下面的 script 。并确定你从你的 Linux CD-ROM 安装了 korn shell 套件 pdksh*.rpm。  
注意 : Korn shell /bin/ksh 在你从Linux CD-ROM 安装 pdksh*.rpm 时就会产生  
-------------------------------------------------------------------------------- 
#!/bin/ksh 
############################################################# 
# Program to Migrate the existing source code in RCS to CVS  
# 
# Needs the korn shell RPM package  pdksh*.rpm from Linux  
# contrib cdrom 
############################################################# 
# 
# rcs2cvs - convert source tree from RCS to CVS 
# 
# project to convert 
PROJECT='project' 
# current RCS root 
RCSROOT="$HOME/rcs" 
if cd "$RCSROOT/$PROJECT" 
then 
        cd "$RCSROOT" 
else 
        echo >&2 "`basename "$0"`: can't change to RCS directory '$RCSROOT/$PROJECT'." 
        exit 1 
fi 
# current CVS root 
CVSROOT="$HOME/cvs" 
# create new CVS directory for project 'project' 
if mkdir "$CVSROOT/$PROJECT" 
then 
        : 
else 
        echo >&2 "`basename "$0"`: can't create CVS directory '$CVSROOT/$PROJECT'." 
        exit 2 
fi 
# create CVS project tree from RCS tree 
find "$PROJECT" -type d -name RCS -print | 
while read RCS 
do 
        CVS="`dirname "$RCS"`" 
        (if cd "$RCS" 
        then 
#               if find . -type f -name '*,v' -print | cpio -pdmv "$CVSROOT/$CVS" 
                if find . -type f -print | cpio -pdmv "$CVSROOT/$CVS" 
                then 
                        : 
                else 
                        echo >&2 "`basename "$0"`: can't convert RCS subdirectory '$RCSROOT/$RCS' to CVS subdirectory '$CVSROOT/$CVS'." 
                fi 
        else 
                echo >&2 "`basename "$0"`: can't change to RCS subdirectory '$RCSROOT/$RCS'." 
        fi) 
done 
-------------------------------------------------------------------------------- 
现在 RCS 已经被改成 CVS 系统下的 'project'. 你可以开始用CVS命令来存取 'project' 这个模组了.  
--------------------------------------------------------------------------------