* 什么是 cvs?
cvs 是一个版本控制系统. 什么是版本控制系统呢?
简单的说, 他可以记录程式码修改的过程, 有一个完整的 history.
辟如说, 当你在修改程式码的时候, 不小心写出了一
个 bug,
但是你可能很久以后才发现多出了这个 bug, 这个时候,
cvs 就能很
有效的帮助你, 找出到底是在哪一次的修改中, 出现了这
个 bug.
或许你会说, 那我每次都把程式码存起来, tar 起来
不就好了,
当然, 你是可以这么做, 但是这太浪费空间了! cvs 在版
本更改间,
只储存他们的 diff 档, 这样可以很有效的省下很多空间
.
再另一个场合里头, 更能显示出 cvs 的好处 -- 多人
一起发展
软体的时候. cvs 支援 remote access, user 并可以对他
要修改的
档案加上 edit 的 flag, 让别人知道他要修改这个档案了
. 然而,
一个较大的发展团队, 一定还会需要一个 mailing list,
用来沟通.
因为, cvs 只是一个管理 project 程式码的工具, 他并不
扮演沟通
的角色.
* 名词
repository: 意思是仓库. 在 cvs 里头, 就是你真正
存放版本
历史的地方.
pserver : 这是 cvs 用来接受 remote 的 cvs command
用的.
cvs 有两种模式, 一种是 local, 一种
是 remote.
cvsroot : 当你使用 cvs 的时候, 必须设定 CVSROOT
这个环
境变数, 或是用 -d 这个选项来指定.
* 简单的例子
- local cvs
现在我正在写 cvs 的文件, 我希望用 cvs 来维护这
些文件.
首先, 我定了一个 cvs root, 当然, 你得 mkdir
setenv CVSROOT "/home/clkao/cvsroot/"
cvs init
cvs init 会帮你把 cvsroot 初始化, 至于初始化哪
些东西, 后面再说.
接著, 开一个要放文件的目录
mkdir /home/clkao/cvsroot/cvsdoc
cd /home/clkao/work
cvs checkout cvsdoc
你会看到下面的讯息:
cvs checkout: Updating cvsdoc
cvs checkout 会把目前最新的版本送到你现在的目录
下, 当你下了
上面的指令后, cvs 会帮你建立 cvsdoc 这个目录.
记住, 不要自己 mkdir /home/clkao/work/cvsdoc,
每个 cvs 工作目录
都还会有一些其他让 cvs 参考的资讯.
接著, 进入 cvsdoc 这个目录, 编辑 cvs.doc 这个档
案, 写了这些有的
没有的.
cvs add cvs.txt
cvs commit -m "Initial revision."
cvs add 会把 cvs.txt 加入 cvs 在维护的 file list.
cvs commit 会把现在目录下所有的东西(cvs.txt) 送
到 repository.
-m 表示这次 commit 的 log message.
现在修改一下 cvs.txt 吧, 就像我现在又继续编辑,
继续把新
的内容加入 cvs.txt, 并且, 在档案的最上面加上 \$Id\$
的字样.
改完之后, 再 commit 一次. (注意, 没有 '\' 喔,
这里 slash 的
目的是避免 cvs 也把这边的 Id 代换掉.
cvs commit -m "Adding new stuff."
cvs log cvs.txt
你会看到每次改的时候, 你加进去的 message. 想想
, 这对写程式,
发展大的 project 的人来说, 是不是一个很棒的工具
呢?
cvs diff -r 1.1 -r 1.2 cvs.txt
这样会显示 1.1 和 1.2 版的 diff, 原本有 1.1 版
的人, 就只需要用
这个 patch 就可以了!
再编辑 cvs.txt, 有没有发现最上面的 Id 变长了?
加了一代串文字,
这显示这个版本的一些相关资讯.
- remote cvs
可是, 我现在要做的是一个大的专案啊, 上面讲的太
小儿科了,
而且我要让好多人一起发展这个专案呢!
这里我举现在正要进行的 xcin-2.5 cvs 建立和使用
的过程当作例子.
su root
检查 /etc/services 有没有这两行, 没有请加入:
cvspserver 2401/tcp #CVS network server
cvspserver 2401/udp #CVS network server
再 /etc/inetd.conf 加入:
cvspserver stream tcp nowait root \
/usr/bin/cvs cvs -b /usr/bin --allow-root /export
pserver
mkdir /export
adduser anoncvs, 这是要给 anonymous cvs 用的.
group 为 nogroup.
新加一个 xcin 的 group.
adduser 参与 xcin 的帐号, 当然, 把他们的 group
设为 xcin
cvs -d /export init
cd /tmp/xcin-alpha, 这是原来已经存在的版本, 现
在要把它放进 cvs 里头.
cvs import xcin-2.5 RXP XCIN_2_5_ALPHA
如此就会把 xcin-alpha 下的东西 import 进 /export/xcin-
2.5 了.
后面的 RXP 是 vendor tag, XCIN_2_5_ALPHA 是 release
tag, tag
的用处很大, 不过我们后面再说.
注意, 一个 user 要从远端 access 的档案, 他必须
再这里拥有适当的权限.
譬如说, /export/xcin-2.5 的 group 应该是 xcin,
且 group writable(
这是 cvs default).
现在试试看从远端存取 cvs 维护的档案.
首先, 在你的机器上建立一个工作目录, 譬如是 /home/clkao/
work
cd /home/clkao/work
cvs -d ":pserver:clkao@cirx.org:/export" login
会出现 prompt 问你 password, 打进去.
cirx.org 是 repository 所在的机器.
当你下了 cvs login 的指令后, 这组 cvsroot 和 encrypted
passwd
会被存在 ~/.cvspass 里头.
cvs -d ":pserver:clkao@cirx.org:/export" checkout
xcin-2.5
这样就会把整套 cvs 所 maintain 的东西 checkout
出来在你的
机器上.
cd xcin-2.5
东看看, 西看看, 发现了一个 bug. 修改好了之后,
就 commit 出去吧.
cvs commit -m "Minor bug fix."
cvs 会搜寻所有他 maintain 的 entry, 看看哪些需
要 commit 的.
这样就大概有一个 cvs 的雏形了! :) 更精采的还在
后头呢!