Emacs 提供了一个功能齐全的 CVS 界面 PCL-CVS,使得 CVS 的工作基本可以单
键完成,此外,Emacs 的 VC
也非常方便。下面简单介绍 PCL-CVS 的使用,之后再
简要介绍 VC 的方便之处。
1. 当然,先用命令行 check out
出源码拷贝
$ cd ~/work
$ cvs -d
:pserver:user@host:/path/to/repository co MODULE
2. 从 Emacs 开始
几个命令都可以进入 PCL-CVS 中,例如用 cvs-examine:
M-x cvs-examine RET
path/to/MODULE RET
RET 表示回车键;path/to/MODULE,源码复本的目录,cvs-examine
缺省为当前
目录。此时 Emacs 打开名为 *cvs* 的缓冲,就是 PCL-CVS 的主界面。
PCL-CVS 只是命令行
cvs 的前端界面。在 *cvs* 缓冲中的命令,基本只需要按
一两下键盘,Emacs 将其翻译为 cvs 控制命令。每执行一次,Emacs
会在缓冲
底部显示对应的 cvs 命令,以供参考。
3. 在 cvs 缓冲中常用的命令
n, p
移动光标。
f, o, RET 打开当前文件。
M-s 列出所有文件的当前状态。
x 在缓冲中去掉所有是 Up-To-Date 的状态的文件,这样比较干净。
M-u 更新本地拷贝。
U 放弃所做的改动,小心别把你没有提交的工作弄没了。
m 标记文件,用于对多个文件同时操作。u
去掉标记并下移;Backspace
去掉标记并上移;M-Backspace 同时去掉 buffer 中所有标记。%
用正
则表达式标记文件。
c 准备提交所做的改动,会弹出一个 *cvs-commit*
缓冲,用来写修改的
日志,写完完按 C-c
C-c,执行提交。如果有标记,同时对所标记的所
有文件相库提交。
C 和 c
类似,但是清除上次提交时留在 *cvs-commit* 缓冲中的内容,不
过如果当前目录里的 ChangeLog
文件中有相关内容,会自动插入。
d 有一个提示,询问用哪种方式 diff。此时常用的可能是:
d
d 或 d =,比较文件,本地拷贝和最后一次提交时的修订版;
d
h 比较本地拷贝和当前源码库中最新版;
d b 比较本地拷贝和该文件的备份;
d e 用 ediff
比较文件,本地拷贝和最后一次提交时的修订版。
d y 和前一天的比较
r 删除文件,从当前拷贝的工作目录中删除,需要提交。
a 添加文件,添加到当前拷贝的工作目录中,需要提交。
i 把某个文件的名字添加到 .cvsignore 文件,这样在运行
cvs 命令时,
cvs 不再理会此文件。编辑 .cvsignore
文件,每一行一个或一类文件。
下面是一个 .cvsignore 文件的例子。有些类型的文件 cvs
缺省就是忽
略的,比如 .o 文件。
t 设置 tag,提示输入 tag 名字。
l 查看一个文件,所标记的多个文件,或目录文件的 log 信息。
s 通过 cvs status
命令查看文件或目录的状态,会弹出一个漂亮的
*cvs-info* 缓冲,列出文件的状态信息。
z, q 关闭
*cvs* 缓冲。
4. cvs buffer 中几种状态的说明(括号中是此时可能需要用到的命令):
cvs buffer
中按一下 M-s 可以列出所有文件。每个一行,分别列出了当前的
CVS 状态、修订版和文件名。
"Up-to-date"
文件和库中文件一致,也就是说,目前是最新的修订版,而且没
有被改动过。(按 f 或 RET,进入文件进行编辑,l 看修改历史,+ 看 tag
信
息)
"Need-Update" 文件相对于源码库,不是最新的,需要更新。(M-u 更新,d h
比较当前文件和源码库中的区别)
"Modified" 文件已经被改动过,但还没有提交到源码库。(c/C 提交,d d 比
较,d
e 用 ediff 比较,U 放弃修改,小心使用)
"Added" 用 cvs add
命令新添加的文件,添加了新文件只在本地有效,需要提
交到源码库。(c/C 提交)
"Removed" 用 cvs 的
remove 命令删除的文件,同 add 一样,需要提交到源码
库。(c/C 提交)
"Needs-Merge"
你编辑文件的时候,别人又向源码库提交过,因此本地的改动,
和源码库中的需要合并。(先 M-u 更新,如果发生冲突,手工修改,再 c/C
提
交,d b 和原来的备份比较,d h 和库中比较)
"Conflict"
你的提交和源码库中当前的状态有冲突,需要手工修改,并再提交
一次。(手工修改,再 c/C 提交)
"Unknown"
源码库中没有该文件,这或许不是你想要的,或许是刚刚新建的。
(如果想让 cvs 忽略此文件,按 i;想添加到源码库,按 a,再提交;用 r
删
除)
"Missing" 源码库中有,可是本地拷贝中却没有了。(M-u 更新,可以从新从源
码库得到拷贝)
5. 用 Emacs 的前缀参数修改 cvs 命令的选项
很多 cvs
命令可以给一个前缀参数,改变缺省的行为。多数的前缀参数都是
C-u,而多数改变的行为,就是修改传递给 cvs 的默认选项。
每执行一次操作,pcl-cvs 的 *cvs* 缓冲底部都会显示实际执行的 cvs 命令,
这些命令往往带有一些参数,如何修改这些参数呢?就通过给
pcl-cvs 的命令
加前缀 C-u。一般的,一个 C-u 只改变当前命令所用的 cvs 选项,如果前缀两
个
C-u,则是永久改变所用选项。
例如,d d 缺省比较当前拷贝和库中你check out时的修订版。
如果用
C-u d d 会提示输入 cvs 的选项,此时你可以给任意的 cvs diff
选项,用以进行各种各样灵活的比较。比如,输入 -r1.10
-r2.3 RET,此
次比较的就是源码库中当前文件修订版 1.10 和 2.3 之间的区别。
如果 C-u
C-u d d,输入 -r1.10 RET,以后的 d d 命令都会带着 -r1.10
仿佛永久修改了默认选项。当然,可以再 C-u C-u
d d 修改回去。
再如,cvs add 命令添加二进制文件需要 -kb 选项,用 C-u a 则提示输入cvs
add
flags,输入 -kb RET,OK。
6. 查看一些信息
在一个文件或目录上,或标记了一些文件,按 l 可以在
*cvs-info* 缓冲中看
到这些文件的 log 信息,就是提交到源码库中的更新日志;按 s 可以看到状态
信息;按 +
也是状态信息,但是 tag 表为树型结构。
按 l 查看 log 信息时,*cvs-info* 缓冲的状态为 (Log-View
CVS)。此时,有
很多方便的操作,比如比较两个修订版之间的不同,修改源码库中的 log 信息,
打开某个文件任意的修订版。比如,在
*cvs* 的某个目录上面按了 l,然后转
到 *cvs-info* 缓冲中,这里面列出的时该目录中所有文件的 log 信息,此时
的常用命令如下。
n, p 移动光标,在一个文件内的不同修订版之间
N,
P 移动光标,在不同的文件之间,M-n, M-p 同样
m 设置 mark
d
和设置 mark 的那个修订版进行 diff
e 修改当前 log,编辑完,C-c C-c
提交
f, o, RET
这几个都是打开当前的修订版,稍有区别。用 f
的时候如果提示
vc-find-version 没有定义,手工加载一下 vc 库
M-x
load-library RET vc RET。
z 关闭该缓冲
如果在 *cvs* 的目录里按
s,此时的 *cvs-info* 缓冲为(CVS-Status CVS)状
态,在这个缓冲中,也可以做类似的一些操作:
N, P 在文件之间移动, M-n, M-p 同样
n, p 上一行,下一行
f, o,
RET
把光标移动到某个 tag 的名字上,则可以直接打开那个 tag
所在
的修订版
T, t 把每个文件所列的 tag 表转为树型结构,T 为横向的树,t
为竖向
的树
diff 命令产生的 *cvs-diff* 缓冲中也类似,N/P 在文件之间移动,n/p
在不
同的 diff 之间移动。此外,在任何一行代码的未知按 o 或 RET 可以直接转到
文件中的实际未知,很方便的。
7. Emacs 的 VC 的方便之处
在 PCL-CVS 中,几乎可以做任何 CVS
相关的操作。但有时候未免有些麻烦,配
合 Emacs 的 VC (Version Control) 会方便很多。
Emacs 的
VC 模式的作者就是著名的 Eric S. Raymond。VC 的功能很强大,而
且方便灵活。可以使用在三种版本管理系统中:RCS、CVS、SCCS,操作方式一致。
和 PCL-CVS 不同的是,VC 使用 C-x v
前缀完成大部分功能,不像PCL-CVS 使
用一个主界面,这使 VC 显得更方便。
几个主要的命令:
C-x
v
v vc-next-action
顾名思义,执行下一个动作,下一个动作是什么就执行什么,如果
是
Unknown 就 cvs add,如果是 Modified 就 commit,如果是
Up-to-date
就什么都不用做了。最方便的是只需在当前 buffer 中
执行。
C-x v
m vc-merge
将库中别人所做的改动与本地的改动合并,和库中的版本保持一致。
C-x v
a vc-update-change-log
更新更改日志文件
ChangeLog。如果源码库或本地拷贝中还没有,
试一下这个,它会根据 cvs 的提交日志,自动产生
ChangeLog,如
果已经有了,但已经有一段时间没有更新过,它会自动更新
ChangeLog
文件到最新的一条记录。
C-x v
~ vc-version-other-window
PCL-CVS
也可以方便的查看某个历史版本,不过都需要转到相应的
控制界面(*cvs* 或 *cvs-info* buffer)中。而 VC
的这个命令可
以在当前缓冲中用,会提示输入版本号,然后显示在另一个窗口中,
并保存在当前目录,文件名为
FILENAME.~REV~。
有时候,用 CVS 管理的东西不需要整体的控制,比如自己的笔记、随笔之类,
用 Emacs
设置上 bookmark,打开就写点,写完马上就提交,往往不必打开
PCL-CVS,恰恰 VC 这些灵活的命令非常合适。
继续了解 VC:
C-x v
= vc-diff
比较文件。如果用了前缀参数,会询问和哪个文件的哪个版本比较。
C-x v
u vc-revert-buffer
放弃没有提交的改动,恢复原状,也就是你的本地拷贝的版本,并
不管库中的最新改动。如果想同时和库中别人所做的改动保持一致,
用
C-u 作为前缀参数。
C-x v
g vc-annotate
看看你的每行代码的状态(编辑历史)。每行的颜色用来表示这行代
码的新旧程度,蓝色的时间最长,红色的最短,其他的居中。默认
的最长时间为一年,超过一年的都显示为蓝色。用前缀参数可以修
改所显示的版本和默认最长时间。
这个缓冲中还有一些有趣的功能,可以直接转到某个修订版。每行
的最前面为当前行最后一次修改的修订版,在这行上按
J,整个缓
冲中的内容全都替换为这个修订版;按 N (或 P)
为缓冲中当前的
后一个(前一个)修订版;按 A
转到当前行上次被修改的版本。N/P
按修订版历史浏览,A 按当前行修改历史浏览,J
跳转该行所指修
订版,W
回到该文件的当前修订版。注意,模式行上文件名的后面
标注了缓冲当前内容的修订版。另外,D
可以比较当前行上的修订
版和前一修订版的区别,N/P 可以使用前缀参数。
C-x v
d vc-directory
打开一个带版本控制功能的 Dired buffer,功能和 pcl-cvs
的
*cvs* buffer 有些类似。或许对非 CVS 的版本管理比较有用。
8.
相关配置
由 CVS 管理的模块中都有 "CVS" 目录,打开 cvs-dired-use-hook 时,在
"CVS"
目录上按 F,直接进入该模块的 *cvs* buffer:
(setq cvs-dired-use-hook 'always)
给 cvs-examine 一个方便的绑定:
(define-key global-map "\C-xve"
'cvs-examine) 绑定到 C-x v e。
Trackback:
http://tb.donews.net/TrackBack.aspx?PostId=59395