一、安装仓库
以root执行
1.创建用户和组
useradd -d /home/cvs --user-group cvs
2.创建仓库目录
mkdir /home/cvsrepo
3.改变组和所有者
chgrp -R cvs cvsrepo
chown -R cvs cvsrepo
4.设定目录的SGID位(使该目录下的所创建的文件和目录所组标识和该目录的组标识一样)
chmod g+srwx /home/cvsrepo
5.初始化cvs仓库目录
cvs -d /home/cvsrepo init
二、CVS常用命令
一般格式: cvs [cvs-options] command [command-options]
CVS参数:
-H command 帮助: 如:cvs -H checkout
-d repository_path 存储库路径(可以在CVSROOT中指定存储库路径): 如:cvs -d /home/cvsrepo checkout testcvs
-e editor 指定编辑器
-n 不改变任何文件,只是看看命令发生了什么(dryrun)
-z compress_level 网络传输时的压缩程度
1.导入项目
格式:cvs -d repository-path import -m "log" projname vendor_tag release_tag
注意:要在projname文件夹下执行
如:项目为testcvs
cd testcvs
cvs -d /home/cvsrepo import -m "first import" testcvs "vendor_tag" "release_tag"
2.创建沙箱
格式:cvs [cvs-options] checkout(co) [command-options] project
选项:
-P 删除空目录
-D date -r revision -r tag 根据日期、修订版、标签调出
-j revision1 -j revision2 合并revision1和revision2的差异到沙箱
-j revision CVS会把共同原版(指比revision和沙箱中的修订版更早的最新修订版)和revision的差异合并到沙箱中
如:cvs -d /home/cvsrepo/ checkout testcvs
3.提交变更
格式:cvs [cvs-options] commit [command-options] [filenames]
选项:
-l 只在当前目录
-R 递归 (默认)
-m message 记录日志
-F file 从文件得到日志信息
-r revision (为提交的文件指定修订版编号,编号必须大于现有仓库中的修订版编号)
如:cvs -d /home/cvsrepo commit -m "test1"
4.显示状态
格式:cvs [cvs-options] status [command-options] [filenames]
选项:
-l 只在当前目录
-R 递归 (默认)
-v 冗长模式
如:cvs status -v
5.更新
格式:cvs [cvs-options] update [command-options] [filenames]
选项:
-d 下载新的目录
-P 不下载空目录
-j revision1 -j revision2 合并revision1和revision2的差异到沙箱
-j revision CVS会把共同原版(指比revision和沙箱中的修订版更早的最新修订版)和revision的差异合并到沙箱中
-A 重设粘滞标记、日期、关键字,并以干线中的最新修订版来替换沙箱中现有的文件,CVS会合并所做的更改
-C 以仓库副本来覆盖沙箱中文件
-l 只在当前目录
-R 递归 (默认)
-D date -r revision -r tag 根据日期、修订版、标签调出文件,并和沙箱中文件的变更合并
-W "wrapper string" 以文件的扩展名来决定更新哪些文件
如:
cvs -d /home/cvsrepo update -d 将仓库的变动更新到沙箱(如不加-d,不会下载新的目录)
cvs -d /home/cvsrepo update -r 1.2(或-D date) 将静态无法变更的文件下载到沙箱,这样的文件即使更改了也无法提交回仓库
应当:
1)备份更改的文件
2)cvs update -A
3)将文件copy回去
4)提交cvs commit
cvs -d /home/cvsrepo update -j sandbox_revision -j repo_revision 还原成先前的修订版
cvs -d /home/cvsrepo -r revision -p > filename 将特定版本的文件写入文件
冲突文件中的情况
冲突:
<<<<<<< 文件名
来自沙箱的内容
=======
来自仓库的内容
>>>>>>> 修订版
修订版文件以.#file.revision的隐藏文件存储在当前目录下
6.新增文件
格式:cvs [cvs-options] add [command-options] [filenames]
选项:
-kb 增加二进制文件
-m 新增文件的描述
如:cvs -d /home/cvsrepo add -kb -m "log" * 增加一个二进制文件,其描述为log(会在cvs log中显示)
7.移除文件(文件没有被移除,只是被移到了Attic目录)
格式:cvs [cvs-options] remove [command-options] [filenames]
选项:
-l 只在当前目录
-R 递归 (默认)
-f 从沙箱移除文件
如:cvs -d /home/cvsrepo remove test1 test2
恢复被移除的文件
1)cvs update -j previous_revision -p filename > filename
2)将文件拷贝到相应目录
3)cvs add filename
4)cvs commit
移动文件
1)备份要移动的文件
2)cvs remove filename
3)进入到要移动到的目录
4)cvs add filename
5)cvs commit
8.释放沙箱
格式:cvs [cvs-options] release [-d] dir
选项:-d 释放并删除沙箱
如:cvs -d /home/cvsrepo release -d testcvs
9.关键字
形式:$keyword$
在你调出或更新文件时,关键字会被扩展
常用的关键字:
$Author$ 最新提交的用户
$Date$ 最新版提交的日期
$Header$ 包括文件的RCS路径、版本、日期、作者等信息
$Name$ 文件调出时所使用的标记名称(分支、标签)
$Log$ 详细的日志信息
$Revision 修订版编号
-kb 二进制文件
-kk 只产生关键字的名称(而不是名称和内容)
-kv 只产生关键字的内容(而不是名称和内容)
-A 重设所有粘滞标记,并取出最新的修订版
如:一个名为kw.test的文件中有如下行:
revision: $Revision$
name: $Name$
author: $Author$
date: $Date$
header: $Header$
(1)黙认模式(名称和内容)
如果将其cvs add kw.test, cvs commit,则再打开时为:
revision: $Revision: 1.3 $
name: $Name: $
author: $Author: haha $
date: $Date: 2009/10/25 06:39:03 $
header: $Header: /home/cvsrepo/testcvs/keyword,v 1.3 2009/10/25 06:39:03 haha Exp $
log: $Log: keyword,v $
log: Revision 1.3 2009/10/25 06:39:03 haha
log: test
log:
log: Revision 1.2 2009/10/25 06:38:36 haha
log: test
log:
(2)-kk模式(只产生关键字的名称)
cvs add -kk kw.test cvs commit,则再打开时为:
revision: $Revision$
name: $Name$
author: $Author$
date: $Date$
header: $Header$
log: $Log$
log: Revision 1.1 2009/10/25 06:46:15 haha
log: test
log:
log: Revision 1.3 2009/10/25 06:39:03 haha
log: test
log:
log: Revision 1.2 2009/10/25 06:38:36 haha
log: test
log:
(3)-kv模式(只产生关键字的内容)
cvs add -kv kw.test cvs commit,则再打开时为:
revision: 1.1
name:
author: haha
date: 2009/10/25 06:49:59
header: /home/cvsrepo/testcvs/keyword2,v 1.1 2009/10/25 06:49:59 haha Exp
log: keyword2,v
log: Revision 1.1 2009/10/25 06:49:59 haha
log: test
log:
log: Revision 1.3 2009/10/25 06:39:03 haha
log: test
log:
log: Revision 1.2 2009/10/25 06:38:36 haha
log: test
log:
(4)改变文件的关键字模式
cvs admin -kb files
10.封装字符串(可以对某一类文件进行操作,当某个文件符合封装字符串时,会改用封装字符串中所指定的合并方法和关键字扩展模式,而不再使用命令中所指定的方法) [可以用在命令update、import中]
格式:
-W "wildcard option 'value' [option 'value' ...]"
选项:
-m 文件的合并做法(COPY或MERGE)
-k b,v,k(关键字扩展模式)
如:cvs update -W"kw.test -k 'v'" (还未用成功??不知什么原因??)
11.指定黙认的CVS命令选项
~/.cvsrc文件(你的HOME目录中)
格式为:每个命令一行
命令 选项
如:
update -P
checkout -P
cvs -d /home/cvsrepo (前面每个命令都指定了存储库路径,利用这个文件可以免去这样的麻烦)12.比较文件的修订版
格式: cvs [cvs-options] diff [command-options] [filenames]
选项:
-r revision or tag 指定修订版
-D date 指定日期最近的修订版
-c 显示每处变更前后几行内容
-y --side-by-side 并排比较两文件
如:
cvs -d /home/cvsrepo diff -r 1.8 -c func 1.8版本和沙箱的差异
cvs -d /home/cvsrepo diff -r 1.8 -r 1.9 -c func 1.8和1.9版本的差异
13.产生修补文件
格式: cvs [cvs-options] rdiff [command-options] [filenames]
选项:
-r revision or tag 指定修订版
-D date 指定日期最近的修订版
-c 显示每处变更前后几行内容
-y --side-by-side 并排比较两文件
如:
cvs -d /home/cvsrepo -r 1.1 -r HEAD testcvs/func > patch.file 创建修补文件
14.显示每行的变更
cvs annotate [filenames] 15.显示历史记录(log | rlog)
格式: cvs [cvs-options] log|rlog [command-options] [filenames]
log需要沙箱,rlog不需要沙箱,但需要指明模块名
选项:
-r revision1:revision2[,revision1:revision2...] 只显示相应修订版的日志
-R 只显示RCS文件名称
-d date[,date...] 只显示某一日期的修订版日志
-h 只输出标头信息
-l 本目录
-t 只显示标头信息和说明文字(description),不显示日志和修订版信息 16.帮助
cvs help
cvs -H command 17.显示版本
cvs version 18.导出文件
格式: cvs [cvs-options] export [command-options] [filenames]
选项:
-l 本目录
-R 递归
-r revision or tag 特定标记
-D date 特定日期
-d dir 导入到的目录名(默认为模块名)
如:
cvs export -R -r HEAD -d dir_name module_name