2006年10月7日

CVS使用与服务器配置

第一部分 基本工作流程
1 登录
2 得到一个工作副本
3 修改
3.1添加档案
3.2删除档案
3.3重命名档案
3.4添加二进制文件
4 查询状态和解决分歧
5 提交和清除副本

第二部分 高级选项

6 取出过去的档案
6.1按时间取出
6.2按标记取出
6.2.1 标记
6.2.2 按标记取出
7 其它选项
7.1 更新工作版本
7.2 锁定与解锁文件
7.3 监视文件
8 分支
8.1 创建分支
8.1.1 基于当前工作副本创建分支
8.1.2 基于旧版本创建分支
8.2 访问分支
8.3 合并分支
8.3.1合并整个分支
8.3.2一个分支多次合并
9 发行软件

第三部分 CVS Server架设及管理

10 配置CVS Server
10.1 CVS的基本配置
10.2 权限设置
10.3 管理文件概述
10.4 外部脚本

附录
A 关键字列表

1 登录
加入环境变量:
echo "export CVSROOT=:pserver:user@server:/path">>~/.bashrc
. .bashrc
注:pserver是服务器验证方式,也可以用别的方式验证,取决于服务器。
user登录的用户名
server服务器
/path服务器仓库路径
也可以不设置环境变量,在登录的时候用-d选项指定。
登录:
如果设置了环境变量,即可用以下方式登录:
cvs login
若没有设置变量,则用以下方式登录:
cvs -d ":pserver:user@server:/path" login
输入密码没出错便是登录成功,提示符什么都没有变。

退出:
cvs logout

2 得到一个工作副本
cvs checkout 档案名

3 修改
3.1添加档案
3.1.1添加文件
在工作副本中创建要添加的文件,然后使用
cvs add filename
命令告诉CVS你希望对该文件进行版本控制,最后使用
cvs commit filename
真正把该文件提交到仓库中。
会弹出一个文本文件让你写注释,若不想弹出,在命令中加-m "comment"直接添加注释。
3.1.2添加目录
在副本中创建目录
mkdir dir
存入档案:
cvs add dir
3.2删除档案
3.2.1删除文件
rm filename
cvs remove filename
cvs commit filename
3.2.2删除目录
在CVS中删除目录就是删除该目录下的所有文件,CVS并不能直接删除目录本身,所以下一次checkout的时候仍会有该目录的存在,若不想该目录存在副本中,在checkout的时候加上-P选项,注意该选项会删除所有的空目录。
进入该目录并删除目录下所有的文件
cvs remove 刚刚删除的所有文件
cvs commit
cvs update -P
3.3重命名档案
3.3.1重命名文件
mv old new
cvs remove old
cvs add new
cvs commit old new
3.3.2重命名目录
mkdir new
cvs add new
mv old/* new/
cd old && cvs remove 刚刚移走的所有文件
cd new && cvs add --------
cd .. && cvs commit
cvs update -P
可以看出删除,移动,重命名的操作是麻烦的,所以在最初建立目录结构的时候一定要谨慎。
3.4添加二进制文件
要注意的是提交二进制文件要加选项-kb
cvs add -kb 文件名
cvs commit 文件名
如果未加-kb 选项,可以用cvs admin 命令来恢复:
cvs admin -kb 文件名
cvs update -A 文件名
cvs commit 文件名

4.查询状态和解决分歧
在提交文件之前,最好查看一下文件的当前状态,以避免和他人发生冲突:
cvs status -v 档案名
常见状态:
Up-to-date : 最新版
Locally Modified : 已修改,还未提交改变
Needs Patch : 需更新
Needs Merge : 另有人向仓库提交了新版本,而你也作了修改
Needs Checkout : 另有人向仓库提交了新版本。
当发现工作副本和库存版本不一致时(若出现需更新和需合并的状况,则需要查看副本和服务器文件的差异),可以用下面的命令查看差异之处:
cvs diff
cvs diff -c
或库存版本和自己的修改有冲突,可以用查询记录的命令看看是和谁发生了冲突:
cvs log
找到和自己相冲突的人员协商解决。

5.提交和清除副本
5.1 提交修改
在对文件作了一些修改之后,需要提交到服务器,用以下的命令可以完成提交:
cvs commit 档案名
写注释不是必须的,但多人开发的时候最好写上注释,而且要注意注释的质量,cvs commit会弹出一个文件让你写注释,如果不想弹出文件,可以加-m选项直接写上注释,如:
cvs commit -m "comment" 档案名
5.2 清除副本
当你完成这个程序并要转到其它任务之前,你需要删除这个副本,这是一个好习惯,因为当你再要用这个程序的时候,你不是需要以前这个版本,而是要到服务器上去checkout新的版本。下面这个命令可以 帮你清除副本:
cvs release -d 档案名
当然你也可以直接用rm命令删除副本,但推荐使用上面的命令,因为它可以帮你检查文件的变动。

6 取出过去的档案
6.1 按时间取出
cvs -q update -D "2006-xx-xx xx:xx:xx GMT"
注意:在按时间取档案的时候最好先用cvs log 档案名 查看要取什么时候的档案,因为在CVS内部使用的是GMT时间,而计算机上多使用本地时间。两者相差很大。取出过去的档案并不能修改它,若要修改就必须开辟分支。
恢复:
cvs -q update -A
6.2 按标记取出
6.2.1 标记
标记是当软件开发到一定阶段后人为的为它打上的标记,以作为将来维护的基点。加 标记的方法如下:
cvs -q tag 标记名称
6.2.2按标记取出:
cvs checkout -r 标记名
cvs -q update -r 标记名
恢复方法同上。

7.其它选项
7.1 更新工作版本
或许别人更改了一些程序,此时应更新一下自己的工作副本:
cvs update
cvs update -d
7.2 锁定与解锁文件
该选项是希望在自己修改文件的同时不让别人修改,用了此选项之后一定要记得在完成工作之后使用解锁命令,否则别人将不能修改此文件。
cvs admin -l file
cvs admin -u file
7.3 监视文件
由于锁定文件之后别人不能checkout,可能会降低工作效率,CVS的跟踪文件可以更好的完成锁定文件的功能,使用cvs watch on命令跟踪一个仓库或文件,那么这个里面的文件就checkout的时候就是只读状态,要编辑他就得先用cvs edit命令,这样别人就能用cvs watchers命令查看有多少人在修改这个文件。

8.分支
当软件正式发行后,你也继续在开发这个软件,准备过一段时间再推出新版本,但发行版本经过一段时间的使用发现了某些BUG,可当前的版本处于不稳定状态,不能基于最新的代码去修改发行版本的错误,这时就需要从发行版文件创建一个分支来修改这个错误,修改之后,可以选择将其合并到主干。
8.1 创建分支
8.1.1 基于当前工作副本创建分支:
cvs tag -b tag_branch(分支版本号)
8.1.2 基于旧版本创建分支
cvs rtag -b -r tag_old tag_branch 档案名
也可使用以下方法为旧版本创建分支:
依标记取出过去的一个版本:
cvs checkout -d dir -r tag_old 档案名
-d表示新建一个目录,取出的档案会放在这个目录中。
进入这个目录 ,创建分支:
cvs tag -b tag_branch
8.2 访问分支
分支是在CVS仓库中创建的,创建分支不会自动把当前的副本切换到分支上,有两种方法访问分支:
更新当前工作副本,使其成为分支:
cvs -q update -r tag_branch
重新按标记检出:
cvs checkout -r tag_branch 档案名
回到主干:
cvs -q update -A
8.3 合并分支
8.3.1 合并整个分支
进入主干目录:
cvs -q update -j tag_branch
cvs -q commit
8.3.2 一个分支的多次合并
假如有一个分支开发到1.2.2.2的时候你合并了一次,但你对分支又进行了开发,到1.2.2.4的时候又想进行一次合并,这时你按第一次合并可以会出现一些问题,你可以指定只合并从1.2.2.2到1.2.2.4 的变化:
cvs -q update -j 1.2.2.2 -j tag_branch
合并的时候可以会发生冲突,你应该在提交新版本之前解决它。

9. 取出档案,发行版本:
由于在checkout的时候CVS会为每个目录加上一个CVS目录,但软件正式发行的时候是不需要这个目录的,可以用以下命令得到一份干净的软件发行版本:
cvs -q export -r 标记名 -d dir 档案名称

10.配置CVS Server
10.1 cvs的基本配置:
检查/etc/services中有没有cvspserver:
cat /etc/services |grep cvs

在/etc/xinetd.d/下建立cvspserver文件,输入以下内容:
service cvspserver
{
disable = no
flags = REUSE
socket_type = stream
wait = no
user = root
protocol = tcp
server = /usr/bin/cvs
server_args = -f --allow-root=/cvspath(这里是CVS的仓库,任选) pserver
}

建立仓库目录:
mkdir $cvspath
chown -R user:user $cvspath
不使用root用户做为cvs的默认用户。将仓库的权限交给user。

重启xinetd:
service xinetd restart

在.bashrc中加入环境变量:
export ":pserver:user@127.0.0.1/cvspath"
运行:
. .bashrc
初始化:
cvs init
或许要先登录再初始化:
cvs login
cvs init

使用cvs import命令将自己的档案导入CVS:
进入源代码目录:
cvs import -m "comment" 档案名 厂商或作者 版本号(可以随便选个,没什么影响)比如有个test项目:
cd test
cvs import -m "注释" test user v_0_0_1

若要建立多仓库CVS,只需在server_args多加一个选项即可,例:
server_args = -f --allow-root=/var/source --allow-root=/var/resource pserver
由于xinetd有长度限制,可以使用如下方法:
注释或删掉server_args行,将server行修改如下所示:
server = /etc/cvs.run (文件位置任选)
在所指定的目录下建立cvs.run文件,该文件要有执行权限:
#!/bin/bash
/usr/bin/cvs -f \
--allow-root=/var/source1a \
--allow-root=/var/source2 \
.............
chmod +x cvs.run
10.2 权限设置:
CVS自己的权限设置有限,只有三个基本文件:
passwd
writers
readers
passwd是为了建立CVS自己的用户认证系统。格式为:
登录用户:加密的密码:系统中对应的用户
writers中的用户可进行写操作。
readers中的用户只可进行读操作。
可以借助系统用户和操作系统自身的文件权限来限制用户的读写。还可以借助各种外部脚本来管理,这个后面再讲。
10.3管理文件概述
在$CVSROOT/CVSROOT目录下有许多文件 ,这里简单介绍一下:
config 配置文件,可以配置系统认证方式以用lockdir等
modules 模块文件
commitinfo 在进行cvs commit的时候会检查这个文件,如果里面有什么脚本的话会先执行这里面的脚本,通过这个文件会实现的功能数不胜数,好好用了。相似的还有loginfo,taginfo
passwd,writers,readers,前面说了。
10.4外部脚本
在CVS源码下有一个contrib目录,这个目录下面有很多脚本并有详细的说明。还有在主页上也有很多工具提供下载。


A 关键字列表
$Author$ 用户名
$Data$ 登记时的时间
$Header$ 标准的首部,包含RCS的完整路径名,日期,作者
$Id$ 除RCS文件名不完整外与$Header$同.
$Log$ 包含RCS的完整路径名,版本号,日期,作者和在提交时提供的日志信息.
$RCSfile$ 包含RCS的文件名,不包括路径名
$Revision$ 分配的版本号
$Source$ RCS文件的完整名
$State$ 分配的版本的状态,由 cvs admin -s 分配.
$CVSHeader$
$Name$
$Locker$
$Date$
-ko:关闭关键字替换

没有评论: