cvs 用法
CVS使用指南
1 概念
CVS是Client/Server结构的并行版本控制系统。
资源库(repository)
存在于服务器上,所有版本的数据仓库。可以把它想象成一个数据库服务器。
模块 (module)
在资源库上,被当成一个整体来维护的版本对象,一个模块由若干文件、目录组成。例如,可以把一个项目当成一个模块。模块可以被当成一个整体被导入(import)、检出(checkout)。
分支(branch)
一个模块的变化可以形成多个并行的分支。分支可以成为一棵树。分支可以看成整个模块的版本。
主分支被称作HEAD。
标记(tag)
在某一时刻,模块中所有的文件处于各自的不同版本,为了保存当前模块的状态,可以对模块做一个标记。将来可以按照这个标记检出文件。相当于一个快照。分支的形成是基于标记的。一个标记可以是分支标记。
标记是应用于文件的,当按照标记检出的时候,只有带某个标记的才被检出。
可以对模块做标记,也可对一些文件做标记。
修订版(revision)
对文件修改的版本号。用系统自动用1.2.3.6之类的来标识。
2 使用
2.1 登录、注销
cvs login
这时候cvs会问密码,输入密码。如果没有任何错误信息,登录成功。
成功登录后将建~/.cvspass文件,保存你的口令,以后就不用输入口令了.
cvs logout
2.2 检出(checkout)
cvs checkout module_name
把一个模块从服务器上检出,到本地计算机上。一个模块只需要在开始使用的时候检出一次,以后使用更新。
2.3 更新文件
cvs update filename
将文件同步到最新的版本:不指定文件名,cvs将同步所有子目录下的文件。最好每天开始工作前或将自己的工作导入到库里前都要做一次,并养成"先同步 后修改"的习惯,和Virvual SourceSafe不同,CVS里没有文件锁定的概念,所有的冲突是在commit之前解决,如果你修改过程中,有其他人修改并commit到了库中, CVS会通知你文件冲突。
2.4 提交文件
cvs commit -m "write some comments here" file_name
确认修改写入到CVS库里。如果不用写-m "comments"而直接确认`cvs commit file_name` 的话,cvs会自动调用系统缺省的文字编辑器(一般是vi)要求你写入注释。
注释的质量很重要:所以不仅必须要写,而且必须写一些比较有意义的内容:以方便其他开发人员能够很好的理解。
每次只确认一个文件到CVS库里是一个很好的习惯,但难免有时候忘了指定文件名,把多个文件以同样注释commit到CVS库里了,以下命令可以允许你修改某个文件某个版本的注释:
cvs admin -m 1.3:"write some comments here" file_name
2.5 查看状态
cvs status filename
状态报告,类似这样:
File: foo.c Status: Up-to-date
Working revision: 1.1.1.1 'Some Date'
Repository revision: 1.2 /home/cvsroot/cvstest/foo.c,v
Sticky Tag: (none)
Sticky Date: (none)
Sticky Options: (none)
这里最重要的就是Status栏,这里总共可能有四种状态:
Up-to-date: 本地的文件与库一致。
Locally Modified: 本地文件比库中文件新。
Needing Patch:本地文件比库中文件旧。
Needs Merge: 本地文件和库中文件都被修改了。
2.6 查看修改历史和注释信息
cvs log file_name
2.7 添加文件和目录
cvs add new_file_name
cvs add -kb new_file_name
cvs add dir_name
CVS一般只处理文本文件,它会扩展keyword(宏)并转换行结束符。
对于图片,Word文档等非纯文本的项目,需要使用cvs add -kb选项,否则有可能出现文件被破坏的情况。
然后确认修改并注释
cvs ci -m "write some comments here" new_file_name
2.8 删除文件
将某个源文件物理删除后。
cvs remove file_name
然后确认修改并注释
cvs ci -m "write some comments here" file_name
注意:很多cvs命令都有缩写形式:commit=>ci; update=>up; checkout=>co; remove=>rm;
2.9 修改文件名
移动文件/文件重命名
cvs里没有cvs move或cvs rename,因为这两个操作是先cvs remove old_file_name,然后cvs add new_file_name实现的。
2.10 目录结构同步
如果在你checkout后,有人添加了新的文件或目录,你需要把他们取出来。
cvs update -d
2.11 放弃本地的修改(undo)
如果修改来了本地文件,不想提交,想重新取新文件。
cvs update -C filename
它会先把你的本地文件改名。
建议:建议大家把checkout的文件缺省为readonly,把"cvs -r"添加到~/.cvsrc文件中 这样,你每次修改一个文件前,先cvs edit filename,提交后文件又变成readonly, 如果你想放弃本地的修改,则cvs unedit filename,它会undo,而且文件又变成readonly。
2.12 恢复到旧版本
cvs update -j1.20 -j1.15 filenames
1.20时当前版本号,注意顺序不要反了,记住要commit,为了保证是当前版本号,最好先lock。
注意:cvs update -r1.15 file.name,这里的-r不是版本号的意思,是给文件加了一个叫1.15的sticky tag
如果不小心已经加成STICK TAG的话:用cvs update -A 解决
2.13 文件比较
cvs diff -c filename
cvs diff -c -r1.8 -r1.5 filename
2.14 锁定与解锁文件
为保证串行的修改文件。
加锁:
cvs admin -l files
解锁:
cvs admin -u files
3 CVS宏
CVS缺省会对文件进行keyword(宏)替换,在文件中加入这些关键字是个良好的工作习惯 。
$Id$ 关键字是用文件名、版本、时间、作者 及代码性质替换,如果使用-l选项取出,在Exp后面会加上登录用户的名称。
$Log$ : 你所提供的修改日志信息。
$Author$ :存入该版本的作者。
$Locker$ : 该版本的加锁者
$State$ : 该版本的状态 Exp(试验版), Stabe(稳定版), Rel(发行版).缺省是Exp
$Date$ : 该版本存入的时间,使用UTC时间格式。
$Revision$ : 该版本的版本号
$RCSfile$ : RCS文件名
$Source$ : RCS全路径名
$Name$ : 取回该版本的符号名
$Header$ : 相当于$ Source $$ Revision$$Date$$Author $$State$$Locker$的组合
4 标签(tag)操作
4.1 对当前模块设置标签
cvs tag release_name module_name
release_name要简洁而含义丰富,由字母开头,加字母,数字,下划线和连字号组成,特别是不能含“.”。
4.2 检出有某个标签文件
cvs checkout -r release_name module_name
4.3 合并
cvs update -A
tag标识的文件是历史文件,不能修改,这样可在本地去除这个限制,让它和当前版本合并。
5 CVS分支管理
5.1 标定里程碑
cvs tag release_1_0 prj_dir_name
5.2 开始一个新的里程碑:
cvs commit -r 2
标记所有文件开始进入2.x的开发
注意:CVS里的revsion和软件包的发布版本可以没有直接的关系。但所有文件使用和发布版本一致的版本号比较有助于维护。
5.3 建立分支
在开发项目的2.x版本的时候发现1.x有问题,但2.x又不敢用,则从先前标记的里程碑:release_1_0导出一个分支release_1_0_b2
cvs rtag -b -r release_1_0 release_1_0_bugfixes prj_dir_name
-r修饰的是release_1_0,-b 修饰的是release_1_0_bugfixes,cvs的版本号将变为4位,以后每分一次支,版本号增加2位
5.4 分支并行开发
一些人先在另外一个目录下导出release_1_0_bugfixes这个分支:解决1.0中的紧急问题,
cvs checkout -r release_1_0_bugfixes
分支是可以修改的,并自动提交到分支上去
而其他人员仍旧在项目的主干分支2.x上开发
5.5 tag分支
在release_1_0_bugfixes上修正错误后,标记一个1.0的错误修正版本号
cvs tag release_1_0_bugfixes_p1
5.6 合并分支
如果2.0认为这些错误修改在2.0里也需要,也可以在2.0的开发目录下合并release_1_0_patch_1中的修改到当前代码中:
cvs update -j release_1_0_bugfixes
5.7 再次合并分支
如果又发现1.x新的bug,我在分支已经修改了,并标定了release_1_0_patch_2,我们同样希望把它合并到主干上来
cvs update -j release_1_0_bugfixes_p1 -j release_1_0_bugfixes
它的意思是把release_1_0_bugfixes_p1(tag)到release_1_0_bugfixes(分支)变化了的部分合并到当前文件(主干)
否则用6步的方法,则以前合并的内容会重新合并
注意:此时我们使用第5步的结果
教训:尽早频繁的tag,但同时不能导致tag泛滥,tag在不同的分支里可以同名
5.8 锁定分支
cvs admin -l r_0_2
锁定r_0_2分支
cvs admin -l
锁定主分支
5.9 设置缺省分支
cvs admin -b r_0_2
设定r_0_2为缺省分支
cvs admin -b
设定主分支
5.10 删除历史记录
如果历史文件过多,或确定有几个阶段的稳定版本,我们可以删除一些历史文件,以保证cvs的性能。
cvs admin -o rev1:rev2 filename
删除rev1到rev2的版本,含这两个版本
cvs admin -o rev1::rev2 filename
删除rev1到rev2的版本,不含这两个版本
如果省略rev1,表示删除本分支rev2之前的所有版本
如果省略rev2,表示删除本分支rev1之后的所有版本
cvs admin -o rev filename
删除rev这个版本的文件
注意:有tag的版本不能被删除,所以tag很重要,而且只能删单个文件
cvs 用法的更多相关文章
- SCP 和 rsync限速以及用法
rsync限速以及用法 -- :: 标签:限速 rsync 原创作品,允许转载,转载时请务必以超链接形式标明文章 原始出处 .作者信息和本声明.否则将追究法律责任.http://xficc.blog. ...
- 关于 Oracle 的数据导入导出及 Sql Loader (sqlldr) 的用法
在 Oracle 数据库中,我们通常在不同数据库的表间记录进行复制或迁移时会用以下几种方法: 1. A 表的记录导出为一条条分号隔开的 insert 语句,然后执行插入到 B 表中2. 建立数据库间的 ...
- oracle sqlloader 用法
向oracle中导入*.csv文件 1.什么是*.csv,如何得到? 里面存放的是数据表.每行代表数据库表格的一行, 每行中,每两个数据中间由逗号","分割. *.csv可以通 ...
- Git 、CVS、SVN比较
Git .CVS.SVN比较 项目源代码的版本管理工具中,比较常用的主要有:CVS.SVN.Git 和 Mercurial (其中,关于SVN,请参见我先前的博客:SVN常用命令 和 SVN服务器配 ...
- SVN中tag branch trunk用法详解
SVN中tag branch trunk用法详解 2010-05-24 18:32 佚名 字号:T | T 本文向大家简单介绍一下SVN中tag branch trunk用法,SVN中tag bran ...
- 前端自动化测试神器-Katalon进阶用法
前言 上一篇介绍了Katalon的基础用法,本篇继续介绍一些进阶的用法. Keyword 和 Method Call Statement Keyword Keyword就是自定义方法,该方法在当前项目 ...
- (二)版本控制管理器之CVS(上)
在前一篇<(一)版本控制管理器之发展史>的介绍中,有提到古典时期的CVS,那什么是CVS?CVS特点是什么?怎么个用法?等一系列的问题,虽然这个版本控制管理器早已过时,但大家了解下也不妨, ...
- Git 安装及用法 github 代码发布 gitlab私有仓库的搭建
版本控制是一种记录一个或若干文件内容变化,以便将来查阅特定版本修订情况的系统. 这个版本控制软件,有 svn还有git,是一个工具. git是由linux的作者开发的 git是一个分布式版本控制系统 ...
- sqlldr的用法 (这个最完整)
转自:http://blog.chinaunix.net/uid-23622436-id-2394093.html 一:在 Oracle 数据库中,我们通常在不同数据库的表间记录进行复制或迁移时会用以 ...
随机推荐
- wikioi 1688 求逆序对
/*=========================================================== wikioi 1688 求逆序对 时间限制: 1 s 空间限制: 12800 ...
- 【转】VS2012程序打包部署详解
上篇博客把收费系统的总体设计进行了一遍讲解,讲解的同时掺杂了些有关.NET编译机制的总结.程序编写测试完成后接下来我们要做的是打包部署程序,但VS2012让人心痛的是没有了打包工具.不知道出于什么原因 ...
- html之label标签
label标签为input元素定义标注,label标签与相关元素通过id属性绑定在一起. 相关属性: for:规定label绑定到哪个表单元素 form:规定label字段所属的一个或多个表单 示例代 ...
- android 完全退出应用程序(重要)
android退出应用程序会调用android.os.Process.killProcess(android.os.Process.myPid())或是System.exit(0),这只是针对第一个A ...
- 墨刀 手机app原型工具
https://modao.io 并且墨刀对开放项目永久免费!
- 【Reporting Services 报表开发】— 交互式报表
我们知道,界面是人与系统间的对话方式,当使用者面对的是冷冰冰的界面,不但会造成使用者对于系统的热情减低,也会因为不便而产生诸多抱怨.尤其像报表时企业内几乎每日都会使用到的工具,因此,如何让使用者可以再 ...
- HBase(六): HBase体系结构剖析(上)
HBase隶属于hadoop生态系统,它参考了谷歌的BigTable建模,实现的编程语言为 Java, 建立在hdfs之上,提供高可靠性.高性能.列存储.可伸缩.实时读写的数据库系统.它仅能通过主键( ...
- HTML 编辑器
使用 Notepad 或 TextEdit 来编写 HTML 可以使用专业的 HTML 编辑器来编辑 HTML: Adobe Dreamweaver Microsoft Expression Web ...
- 剑指offer系列29-----链表中环的入口节点-
[题目]一个链表中包含环,请找出该链表的环的入口结点. [思路]方法一:使用双指针 方法二:利用set集合的特性,不能添加重复数字,否则返回false package com.exe7.offer; ...
- 剑指offer系列23---字符串排列(不是很理解)
[题目]输入一个字符串,按字典序打印出该字符串中字符的所有排列. 例如输入字符串abc,则打印出由字符a,b,c所能排列出来的所有字符串abc,acb,bac,bca,cab和cba. 结果请按字母顺 ...