QQ登录

只需一步,快速开始

 找回密码
 注册

QQ登录

只需一步,快速开始

查看: 653|回复: 0

CVS快速入门

[复制链接]
发表于 2004-7-24 23:47:24 | 显示全部楼层 |阅读模式
声明:作者同意将本文自由传播,但不得删改包括本声明及以下呼吁在内的任何内容。

呼吁:宪法第一条“中华人民共和国是工人阶级领导的、以工农联盟为基础的、
人民民主专政的社会主义国家。”所体现的阶级等级和专政思想与“人权天赋、
约法共和、自主选择、平等竞争”的政治文明常识相违背,呼吁人大将其改为
“中国是全体公民组成的,致力于保障公民基本权利,为公民的生存与发展提供
良好公共环境的法治国家。中国全体公民的基本权利一律平等。”

                       CVS快速入门
                         丁建华 <[email protected]> 2004.7.23

    CVS 是个版本管理系统, 不仅适用于团队的, 开放的开发, 也适用于个人的
源文件管理.

===================================================================
??? 网上很多开放源码的项目都提供 CVS 服务器, 我自己使用 CVS 管理文档是否
也需要建立服务器?
!!! 不需要. 你可以把本机的任何文件目录作为 CVS 的储藏室 (repository).

===================================================================
??? 如何把一个本机文件目录初始化成储藏室呢?
!!! <cmd> cvs -d /home/me/myrepos init </cmd>

===================================================================
??? 我用 <cmd> cvs -d myrepos init </cmd> 为什么不行?
!!! CVS 需要使用绝对路径来指定储藏室位置. 文档中说: 如果你指定的储藏室地址
以 '/' 开头, 则被认为是 :local: 访问方式. 否则将被认为是 :server:
(或 :ext:, 视操作系统而定) 访问方式.

===================================================================
??? 我一定要在命令行指定储藏室地址吗?
!!! 你也可以使用 CVSROOT 环境变量. 比如:
<cmd> export CVSROOT=/home/me/myrepos </cmd>
<cmd> cvs init </cmd>

===================================================================
??? 我有一堆文件, 如何提交给 CVS 进行版本管理?
!!! 首先要对这些文件进行分类, 建立适当的目录结构. 比如在目录 myproj 下面建立
子目录 doc, src 等等. 然后导入 (import) 到储藏室:
<cmd> cd myproj </cmd>
<cmd> cvs -d /home/me/myrepos import -m "Started" proj me start </cmd>
其中 proj 是储藏室中的目录, me 是供应商标签(vendor tag), start 是发行标签
(release tag). -m "Started" 是对本次操作的简短说明. 如果命令行上不提供这种
说明, 就会自动启动编辑器, 要你使用编辑器来提供这种说明.

===================================================================
??? 然后我对这些文件的修改就可以提交给 CVS 做记录并进行管理了吗?
!!! 不是. 这个目录下并没有 CVS 进行管理所必要的控制文件. 你必须从储藏室中
拣出 (checkout) 一个工作副本 (working copy), 并在这个工作副本上工作.
CVS 只能管理工作副本.

===================================================================
??? 如何拣出一个工作副本呢?
!!!
<cmd> cd .. </cmd>
<cmd> cvs -d /home/me/myrepos checkout proj </cmd>
<cmd> cd proj </cmd>
与原来文件目录的主要区别是, 每个目录下都增加了一个子目录 CVS, 其中存放的
就是版本管理所需要的控制文件.

===================================================================
??? 如何告知 CVS 需要增加一个文件呢?
!!! 如果你是在工作副本上工作, 你可以:
<cmd> cvs add thefile </cmd>
<cmd> cvs commit -m "Add the new file" </cmd>
如果这个文件是个二进制文件, 就需要:
<cmd> cvs add -kb thefile </cmd>
每次只能增加当前目录下的文件, 不能处理子目录.

===================================================================
??? 我注意到命令中不再指定储藏室的位置了, 为什么?
!!! 在工作副本上执行 CVS 命令, 通常不需要在命令行上指定储藏室的位置.
而是自动从控制文件 CVS/Root 中读取.

===================================================================
??? 如何告知 CVS 一个文件已被修改呢?
!!!
<cmd> cvs edit thefile </cmd>
<cmd> cvs commit -m "The file has been modified" </cmd>

===================================================================
??? 如何比较当前工作文件与储藏室相应文件的内容是否一致?
!!!
<cmd> cvs diff thefile </cmd>

===================================================================
??? 如何告知 CVS 需要删除一个文件呢?
!!!
<cmd> rm thefile </cmd>
<cmd> cvs remove thefile </cmd>
<cmd> cvs commit -m "The file has been removed" </cmd>

===================================================================
??? 如何告知 CVS 一个文件已经改名?
!!! 删除旧的文件, 增加新的文件.
<cmd> mv oldfilename newfilename </cmd>
<cmd> cvs remove oldfilename </cmd>
<cmd> cvs add newfilename </cmd>
<cmd> cvs commit -m "Rename oldfilename to newfilename" </cmd>

===================================================================
??? 每个操作都要 commit 吗?
!!! 不是. 你可以多次 add, edit, remove, 然后一次提交 (commit). 在提交之前,
你甚至可以用 add 来取消前一个错误的 remove, 或者相反, 用 remove 取消错误的
add. commit 简写是 ci, 意为"拣入 (check in)". 但是并没有 checkin 这个命令.

===================================================================
??? 错误的 add 或 remove 可以在提交之前被取消, 那么错误的 edit 呢?
!!!
<cmd> cvs unedit thefile </cmd>

===================================================================
??? 如何查看一个文件当前处于什么状态?
!!!
<cmd> cvs status thefile </cmd>

===================================================================
??? 如何知道一个文件都进行过哪些修订?
!!! 查看这个文件的日志 (log).
<cmd> cvs log thefile </cmd>

===================================================================
??? 如何结束一个工作副本的工作?
!!! 把当前工作副本予以发布 (release).
<cmd> cvs release </cmd>
如果还想删除工作副本, 就用 release 的 -d 选项.
<cmd> cd .. </cmd>
<cmd> cvs -d /home/me/myrepos release -d proj </cmd>
注意这个命令行中有两个 -d 选项, 其含义是完全不同的.

===================================================================
??? 这么说文件都放在储藏室里了, 我怎么把它们拿出来用呢?
!!! 把整个项目导出 (export):
<cmd> cvs -d /home/me/myrepos export -r HEAD proj </cmd>
导出的目录不包含存放控制文件的 CVS 子目录. 另外, 导出必须指定标签(或日期).
如果没有合适的标签, 可以使用内置的标签 HEAD (表示最新修订版).

===================================================================
??? 我知道了如何初始化 (init) 一个储藏室, 导入 (import) 一批文件,
拣出 (checkout) 一个工作副本, 增加 (add), 删除 (remove), 编辑 (edit),
取消编辑 (unedit) 文件, 提交 (commit) 所做的变动. 查看文件的状态 (status)
和日志 (log), 比较文件的内容 (diff). 发布 (release) 整个工作副本.
导出 (export) 整个项目. 可是这一切与版本控制有什么关系呢? 什么是版本控制呢?
!!!
一篇文章可能有草稿, 初稿, 修改稿, 定稿. 一本书可能有修订版, 甚至第二次
修订, 第三次修订. 一套软件可能更需要不断除虫, 不断升级. 所谓版本控制, 就是
记录整个修订历程, 使得用户可以把源文件恢复到任何一次修订时的状态, 或者比较
两次修订的内容, 或者合并不同作者所做的修订, 或者合并不同分支的修订.

===================================================================
??? 什么是对文件的一次修订?
!!! 对文件的一次修订是通过修订序号 (revision numbers) 来标志的. 新建项目
所有文件的修订序号是 1.1 , 前一个叫主序号, 后一个叫副序号. 在所做的编辑
被提交之后, 该文件的副序号加一. 由于不同文件被编辑的次数不同, 因此经过一段
时间的修订之后, 各个文件的修订序号会变得参差不齐.

===================================================================
??? 那么主序号在什么情况下会变动呢?
!!! 主序号只能通过命令来增加, 比如把指定文件 thefile 升为 2.0:
<cmd> cvs commit -m "Up the file to 2.0" -r 2.0 thefile </cmd>
另外新增加文件的主序号会被设置为当前目录下所有文件的主序号的最大值.

===================================================================
??? 那岂不是很乱, 如果有几十个文件, 我要记下几十个修订序号以便将来恢复到
某个状态吗?
!!! 原理上是这样, 但并不是用手工, 而是用标签 (tag) :
<cmd> cvs tag my-tag-1 </cmd>
也可以只给指定的一批文件贴标签:
<cmd> cvs tag my-tag-1 thefiles </cmd>
以后你就不用说: 把 file1 恢复到 1.3, file2 恢复到 2.0, file3 恢复到 1.5 了,
而可以说: 把所有文件恢复到 my-tag-1 . 这通常是使用 -r 选项, 比如拣出一个项目:
<cmd> cvs checkout -r my-tag-1 proj </cmd>

===================================================================
??? 我怎么知道什么文件上贴了什么标签呢?
!!! 用 status 命令的 -v 选项:
<cmd> cvs status -v thefile </cmd>

===================================================================
??? 标签的名字有什么限制吗?
!!! 只能用字母, 数字, '_' 和 '-'.

===================================================================
??? 有人说 BASE 和 HEAD 是两个特殊标签, 是怎么回事儿?
!!! 作为标签, BASE 表示的是当前工作副本在当初拣出的时候各个文件的修订序号.
HEAD 表示的是当前项目各个文件的最新修订序号.

===================================================================
??? 如何删除标签呢?
!!! 如果删除所有文件上的指定标签, 可以:
<cmd> cvs tag -d my-tag-1 </cmd>
如果要删除指定文件上的指定标签, 可以:
<cmd> cvs tag -d my-tag-1 thefiles </cmd>

===================================================================
??? 如何把标签改名?
!!! 先给所有贴了旧标签的文件贴上新标签, 然后删除所有旧标签.
<cmd> cvs tag -f oldtag newtag </cmd>
<cmd> cvs tag -d oldtag </cmd>

===================================================================
??? 文档中常常提到某些情况下标签是"粘乎 (sticky) 的", 什么意思?
!!! 举例来说, 如果你使用 <cmd> cvs checkout -r my-tag-1 proj </cmd> 拣出
一个项目, 那么这个标签 my-tag-1 就是粘乎的. 你的所有操作将缺省的针对这个
标签所代表的版本来进行, 直到你使用 <cmd> cvs update -A </cmd> 来清除粘乎
标签, 更新成最新版本. 如果你不知道粘乎标签的作用, 就可能无法理解某些操作
所产生的结果. 比如, 你执行 <cmd> cvs update </cmd> 可能期待着更新成最新
版本, 结果却只能更新到粘乎标签所代表的版本.

===================================================================
??? 文档中经常提到 keyword 替换, 是怎么回事儿?
!!! 比如你的文件中如果有 $Id$ , 那么提交给储藏室之后, 会被替换成类似于
$Id: myfile.v 2.0 2004/07/20 14:28:47 djh Exp $ 的东西.

===================================================================
??? 储藏室内的文件也是目录结构的, 我可以导入一个子目录吗?
!!! 可以.
<cmd> cd themodule </cmd>
<cmd> cvs import -m "Import a module" proj/mod me start </cmd>

===================================================================
??? 以后我总要使用 proj/mod 这样的路径名吗?
!!! 你可以给储藏室中的子目录指定一个模块名, 用模块名来代替相应的路径名.
<cmd> cvs checkout CVSROOT/modules </cmd>
<cmd> cd CVSROOT </cmd>
在文件 modules 中增加一行: <code> mymod proj/mod </code> , 然后
<cmd> cvs commit -m "Add mymode" modules </cmd>
<cmd> cd .. </cmd>
<cmd> cvs release -d CVSROOT </cmd>
以后你就可以:
<cmd> cvs -d /home/me/myrepos checkout mymod </cmd>

===================================================================
    另外, 分支 (branch) 是 tag 的一种用法, -b 或 -B 选项. 合并 (merge)
是 update 的一种用法, -j 选项, join 之意. 其他冲突 (conflict) 处理,
观察 (watch) 等服务器方式下的概念就不讲了.

    CVS 的内容非常丰富, 本文仅仅是个快速入门. 入门之后, 各人根据自己的实际
需要再去查文档, 在应用中逐步丰富经验. 对那些用不着的功能, 没必要浪费时间.

    感谢您的阅读. 本人水平有限, 错漏之处, 欢迎拍砖. )

<the-end/>

--
            支持公民自主,反对为民作主,更反对代民作主。
            支持公民平等,反对城市特权,更反对党派特权。
            支持守法治国,反对以法治国,更反对以德治国。
            支持法权独立,反对行政干预,更反对军权干预。
呼吁人大废除宪法第一条部分人高于其他人的歧视条款,尽快建立独立于行政的
司法体系,实现人人平等、依法共和的现代公民社会。    请一起采用本签名档。
※ 来源:·饮水思源 bbs.sjtu.edu.cn·[FROM: 61.52.247.254]
您需要登录后才可以回帖 登录 | 注册

本版积分规则

GMT+8, 2024-11-8 03:42 , Processed in 0.045991 second(s), 16 queries .

© 2021 Powered by Discuz! X3.5.

快速回复 返回顶部 返回列表