学习CVS
作者:夏清然
CVS概述
CVS(Concurrent Versions System)是目前使用最多的源代码版本控制系统。多个开发人员通过一个中心的版本控制系统来记录文件版本的变化信息,并通过客户端得到和更新“中心”的文件,从而保证文件同步。CVS环境配置
配置用户认证。
- cvs本身基于pserver的远程认证 需要定义服务器和用户组,用户名,设置密码等。常见的登录格式如下:
cvs -d :pserver:cvs_user_name@cvs.server.address:/path/to/cvsroot login
这种方式的安全性不高,所以一般只作为匿名、只读对CVS的访问。例如check out GNU Emacs的代码:
cvs -d:pserver:anonymous@cvs.savannah.gnu.org:/sources/emacs co .
cvs -d :ext:cvs_user_name@cvs.server.address:/path/to/cvsroot login
设置CVSROOT和CVS_RSH环境变量方便CVS使用
sh or Bash shell:export CVSROOT=:ext:cvs_user_name@cvs.server.address:/path/to/cvsroot export CVS_RSH=ssh cvs co projectcsh:
setenv CVSROOT ':ext:cvs_user_name@cvs.server.address:/path/to/cvsroot' setenv CVS_RSH ssh cvs co project
但是通过设置CVSROOT环境变量的方法只能在系统中设置一个CVS,要同时使用多个CVS最好使用alias为cvs命令另起一个别名:
sh or Bash shell:alias cvs1="cvs -d :ext:cvs_user_name@cvs.server.address:/path/to/cvsroot" cvs1 co -R projectcsh:
alias cvs1 "cvs -d :ext:cvs_user_name@cvs.server.address:/path/to/cvsroot" cvs1 co -R project生成密钥。
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$ | 显示特定版本的信息 |