学习CVS

作者:夏清然

CVS概述

CVS(Concurrent Versions System)是目前使用最多的源代码版本控制系统。多个开发人员通过一个中心的版本控制系统来记录文件版本的变化信息,并通过客户端得到和更新“中心”的文件,从而保证文件同步。

CVS环境配置

配置用户认证。

生成密钥。

ssh-keygen -b 1024 -t dsa
如果接受默认设置,那么私钥和公钥文件分别位于:~/.ssh/id_dsa和~/.ssh/id_dsa.pub。

CVS使用

CVS的命令使用格式为:
cvs [cvs_options] cvs_commmand [command_options] [command_args]

cvs_options

--allow-roo=rootdir 指定CVSROOT路径(服务器端专用)
-a 认证所有命令
-d CVSROOT 指定CVSROOT
-e editor 设定checkin和commit的log的编辑器
-f 跳过~/.cvsrc文件
-H or --help 显示命令帮助
-l 不向CVSROOT/history文件记录日志
-n 不修改任何文件
-Q 完全安静模式
-q 稍微安静模式
-r 检出本地工作拷贝为只读
-T tempdir 设定临时目录为tempdir
-t 获知程序的执行状况,显示每步CVS的操作信息。
-v or --version 显示cvs版本等相关信息
-w 新同步的本地工作拷贝为读+写权限
-x 加密所有通信(只能用于客户端)
-z gzip-level 设置传输的压缩律(1-9)

cvs_command

add 添加新文件
admin 仓库管理
annotate 显示一个文件的每行历史修改情况
checkout 检出代码
commit 提交代码
diff 比较两个代码间的差距
edit 准备编辑一个文件
editors 显示工作在此文件上的用户
export 导出代码(不包含CVS目录)
history 显示库文件的历史
import 第一次导入代码
init 创建一个新的CVS库
log 显示一个文件的checkin logs
login 登录(一般是要求pserver密码认证的才需要登录)
logout 取消登录状态
rdiff 对两个版本间的库进行diff
release 不需要再使用一个库了,所以释放
remove 移除一个文件
rtag 根据tag打tag
status 显示文件状态信息
tag 打tag
unedit 取消对本地拷贝的编辑
watch 告诉CVS服务器提供关于文件的提示
wathers 列出谁watch这个文件

command_args

add命令
命令格式:add [options] [files]...
用于向仓库中添加文件或目录。

-k rcs-kflag 使用rcs-kflag给添加的文件指定kflag
-m message 加入创建文件的log为"message"

admin命令
命令格式:admin [options] [files]...
用于管理仓库中的文件。

-a users 添加能够访问访问文件的用户(多个人用逗号隔开)
-A file 追加另外一个用户访问列表文件
-b [rev] 设置默认分支
-c string 设置commit的头
-e [users] 从访问列表中移出用户
-I 交互模式运行
-k substring 设置关键字替代字符
-l [reversion] 锁定指定的版本(如果没有参数那么就锁定最新的HEAD和BRANCH)
-L 更严格的锁定
-m rev:msg 替代特定版本的log信息
-n tag[:[rev]] 对BRANCH或指定版本打tag。(如果:rev省略,那么删除tag;如果rev省略,那么对默认分支上的最新版本打tag
-N tag[:[rev]] 同“-n tag[:[rev]]”,同时覆盖已有tag
-o [rev1:rev2] 删除从rev1到rev2之间的版本(包括rev1和rev2)
-q 静默运行
-s state[:rev] 设置一个版本的状态
-t [file] 得到一个文件的描述信息
-t -string 设置一个文件的描述信息
-u [rev] 解除对rev版本的锁定
-U 解除严格锁定

annotate命令
命令格式:annotate [options] [files]...
显示最新版本的每一行是被哪个版本加入的。

-D date 显示在特定日志之前的文件每一行的修改状态
-f 如果date/tag找不到那么就用HEAD的最新版
-l 只在当前目录运行
-R 从当前目录递归处理
-r tag 从指定的tag进行

checkout命令
命令格式:checkout [options] modules...
从CVS库检出一份本地拷贝。

-A 重置任何的关联标签/日期/和配置
-c 列出CVS库的内容
-D date 根据date检出
-d dir 检出并放到dir目录中
-f 如果指定的tag和日期不存在那么就使用HEAD
-j revision 把revision的代码合并到当前的版本中
-k kflag 使用kflag关键字扩展
-l 只检出指定代码库的目录本身内容,非递归
-N 不缩短代码库的路径(带上CVSROOT),即使-d选项指定了CVSROOT
-n 不缩短代码库的路径(带上CVSROOT)
-P 跳过空目录
-p 把检出的内容打印到标准输出
-R 递归检出代码库目录(默认使用)
-r tag 检出指定版本代码库
-s 列出CVS库的内容和状态

commit命令
命令格式:commit [options] files...
把本地修改提交到CVS库中。

-c 在执行检入之前检查有效的编辑修改
-F file 从file文件读取commit log
-f 非递归查找检入文件(只检入当前目录修改)
-m msg 指定检入logs为msg
-l 只检入当前目录(非递归)
-r rev 检入指定的rev版本(分支或主干)

diff命令
命令格式:diff [options] files...
显示一个文件的两个版本间的不同。

-D data1 比较特定时间date1文件和当前文件的差别
-D date1 -D data2 比较date1和date2两个时间的文件间的差别
-r rev1 -r rev2 比较两个版本间的差别
-l 本地目录非递归比较
-R 递归当前目录并进行比较

export命令
命令格式:export [options] modules...
从CVS中导出代码。

-D date 导出指定日志的代码
-d dir 导出代码并存入dir目录
-f 如果tag/date没有找到那么从HEAD执行
-l 只在当前指定的目录进行
-N 不缩短代码库文件路径(必须加上CVSROOT全路径),即使-d选项指定了CVSROOT
-P 跳过空目录
-R 递归处理
-r tag 导出指定tag代码

history命令
命令格式:history [options] [files...]
显示修改历史。

-a 所有人的修改历史(默认是自己)
-b str
-c 只显示自己修改过的文件的历史
-D date 从date开始的文件修改历史
-e 报告所有的修改
-l 最后一次修改
-m module 显示module内的历史信息
-n module 在module内
-o 报告检出模块的历史信息
-r rev 报告从rev版本后的修改历史
-t tag 显示从tag开始的所有用户的修改历史
-u user 显示user的修改历史

import命令
命令格式:import [options] repository vendor-tag release-tag...
导入第三方代码入CVS库。

-b branch 导入"vendor-branch"中的分支中
-d 使用文件的修改时间做为其导入的时间
-m msg 把msg做为log提交
-I ign 忽略文件

log命令
命令格式:log [options] [files...]
显示文件的历史信息。

-b 列出所有的版本信息
-d dates 列出指定日期内的历史信息
-h 只输出文件头信息
-l 只在当前目录运行
-N 不列出tag
-R 只打印CVS库中保存的RCS文件名
-r revs 输出revs版本的所有信息
-s stats 列出指定stats的版本
-t 打印文件头和描述信息
-w logins 列出被指定人(login)检入的代码信息

status命令
命令格式:status [options] files...
显示文件的状态信息。

-l 只列出本地工作目录的文件状态信息
-R 递归的列出当前目录下文件状态信息
-v 列出包含所有文件的tag信息

tag命令
命令格式:tag [options] tag files...
对文件打tag或创建分支。

-b 创建分支
-B 小心模式。如果同时有-F和-d选项执行,那么会中断打标签过程。
-c 检查工作目录文件是否被修改。
-d 删除tag
-F 移动已经存在的tag。
-f 强制使用一个HEAD,如果tag不存在
-l 只在本地工作目录操作,非递归操作下级目录。
-R 递归处理目录。

rtag命令
命令格式:rtag [options] tag files...
对文件打tag或创建分支。

-a 从删除的文件中
-b 生成一个名为“tag”的分支
-B 安全方式,如果同时有“-F”或“-d”,那么停止操作
-d 删除tag
-F 如果tag存在,那么移动tag
-f 如果指定的tag和date不存在,那么指定为HEAD版本
-l 只在本地工作目录操作,非递归操作下级目录
-R 递归处理目录
-r rev/tag 在已经存在的rev或tag上进行操作
-D date 对一个时间的代码进行操作

remove命令
命令格式:remove [options] [files...]
从仓库中删除文件。

-f 先从本地工作目录删除文件再在仓库中删除文件。
-l 只在本地工作目录操作,非递归操作下级目录。
-R 递归处理目录。

CVS系统关键字

将CVS内置tags加入程序开头的注释是非常好的习惯,能帮助程序员很方便的通过程序了解其状态信息。

CVS支持的关键字:
$ZEUUX: www/zeuux.org/science/learning-cvs.cn.html,v 1.11 2008/07/07 04:10:08 qingran Exp $ 标记程序的修改人、修改时间和版本
$Header$ 程序头
$Author$ 程序修改人
$Date$ 程序修改时间
$Revision$ 程序版本
$Locker$ 显示锁定版本的人
$Source$ 显示文件在代码库中的全路径
$State$ 显示特定版本的信息