Emacs 提供了一個(gè)功能齊全的 CVS 界面 PCL-CVS,使得 CVS 的工作基本可以單
鍵完成,此外,Emacs 的 VC
也非常方便。下面簡單介紹 PCL-CVS 的使用,之后再
簡要介紹 VC 的方便之處。
1. 當(dāng)然,先用命令行 check out
出源碼拷貝
$ cd ~/work
$ cvs -d
:pserver:user@host:/path/to/repository co MODULE
2. 從 Emacs 開始
幾個(gè)命令都可以進(jìn)入 PCL-CVS 中,例如用 cvs-examine:
M-x cvs-examine RET
path/to/MODULE RET
RET 表示回車鍵;path/to/MODULE,源碼復(fù)本的目錄,cvs-examine
缺省為當(dāng)前
目錄。此時(shí) Emacs 打開名為 *cvs* 的緩沖,就是 PCL-CVS 的主界面。
PCL-CVS 只是命令行
cvs 的前端界面。在 *cvs* 緩沖中的命令,基本只需要按
一兩下鍵盤,Emacs 將其翻譯為 cvs 控制命令。每執(zhí)行一次,Emacs
會在緩沖
底部顯示對應(yīng)的 cvs 命令,以供參考。
3. 在 cvs 緩沖中常用的命令
n, p
移動(dòng)光標(biāo)。
f, o, RET 打開當(dāng)前文件。
M-s 列出所有文件的當(dāng)前狀態(tài)。
x 在緩沖中去掉所有是 Up-To-Date 的狀態(tài)的文件,這樣比較干凈。
M-u 更新本地拷貝。
U 放棄所做的改動(dòng),小心別把你沒有提交的工作弄沒了。
m 標(biāo)記文件,用于對多個(gè)文件同時(shí)操作。u
去掉標(biāo)記并下移;Backspace
去掉標(biāo)記并上移;M-Backspace 同時(shí)去掉 buffer 中所有標(biāo)記。%
用正
則表達(dá)式標(biāo)記文件。
c 準(zhǔn)備提交所做的改動(dòng),會彈出一個(gè) *cvs-commit*
緩沖,用來寫修改的
日志,寫完完按 C-c
C-c,執(zhí)行提交。如果有標(biāo)記,同時(shí)對所標(biāo)記的所
有文件相庫提交。
C 和 c
類似,但是清除上次提交時(shí)留在 *cvs-commit* 緩沖中的內(nèi)容,不
過如果當(dāng)前目錄里的 ChangeLog
文件中有相關(guān)內(nèi)容,會自動(dòng)插入。
d 有一個(gè)提示,詢問用哪種方式 diff。此時(shí)常用的可能是:
d
d 或 d =,比較文件,本地拷貝和最后一次提交時(shí)的修訂版;
d
h 比較本地拷貝和當(dāng)前源碼庫中最新版;
d b 比較本地拷貝和該文件的備份;
d e 用 ediff
比較文件,本地拷貝和最后一次提交時(shí)的修訂版。
d y 和前一天的比較
r 刪除文件,從當(dāng)前拷貝的工作目錄中刪除,需要提交。
a 添加文件,添加到當(dāng)前拷貝的工作目錄中,需要提交。
i 把某個(gè)文件的名字添加到 .cvsignore 文件,這樣在運(yùn)行
cvs 命令時(shí),
cvs 不再理會此文件。編輯 .cvsignore
文件,每一行一個(gè)或一類文件。
下面是一個(gè) .cvsignore 文件的例子。有些類型的文件 cvs
缺省就是忽
略的,比如 .o 文件。
t 設(shè)置 tag,提示輸入 tag 名字。
l 查看一個(gè)文件,所標(biāo)記的多個(gè)文件,或目錄文件的 log 信息。
s 通過 cvs status
命令查看文件或目錄的狀態(tài),會彈出一個(gè)漂亮的
*cvs-info* 緩沖,列出文件的狀態(tài)信息。
z, q 關(guān)閉
*cvs* 緩沖。
4. cvs buffer 中幾種狀態(tài)的說明(括號中是此時(shí)可能需要用到的命令):
cvs buffer
中按一下 M-s 可以列出所有文件。每個(gè)一行,分別列出了當(dāng)前的
CVS 狀態(tài)、修訂版和文件名。
"Up-to-date"
文件和庫中文件一致,也就是說,目前是最新的修訂版,而且沒
有被改動(dòng)過。(按 f 或 RET,進(jìn)入文件進(jìn)行編輯,l 看修改歷史,+ 看 tag
信
息)
"Need-Update" 文件相對于源碼庫,不是最新的,需要更新。(M-u 更新,d h
比較當(dāng)前文件和源碼庫中的區(qū)別)
"Modified" 文件已經(jīng)被改動(dòng)過,但還沒有提交到源碼庫。(c/C 提交,d d 比
較,d
e 用 ediff 比較,U 放棄修改,小心使用)
"Added" 用 cvs add
命令新添加的文件,添加了新文件只在本地有效,需要提
交到源碼庫。(c/C 提交)
"Removed" 用 cvs 的
remove 命令刪除的文件,同 add 一樣,需要提交到源碼
庫。(c/C 提交)
"Needs-Merge"
你編輯文件的時(shí)候,別人又向源碼庫提交過,因此本地的改動(dòng),
和源碼庫中的需要合并。(先 M-u 更新,如果發(fā)生沖突,手工修改,再 c/C
提
交,d b 和原來的備份比較,d h 和庫中比較)
"Conflict"
你的提交和源碼庫中當(dāng)前的狀態(tài)有沖突,需要手工修改,并再提交
一次。(手工修改,再 c/C 提交)
"Unknown"
源碼庫中沒有該文件,這或許不是你想要的,或許是剛剛新建的。
(如果想讓 cvs 忽略此文件,按 i;想添加到源碼庫,按 a,再提交;用 r
刪
除)
"Missing" 源碼庫中有,可是本地拷貝中卻沒有了。(M-u 更新,可以從新從源
碼庫得到拷貝)
5. 用 Emacs 的前綴參數(shù)修改 cvs 命令的選項(xiàng)
很多 cvs
命令可以給一個(gè)前綴參數(shù),改變?nèi)笔〉男袨?。多?shù)的前綴參數(shù)都是
C-u,而多數(shù)改變的行為,就是修改傳遞給 cvs 的默認(rèn)選項(xiàng)。
每執(zhí)行一次操作,pcl-cvs 的 *cvs* 緩沖底部都會顯示實(shí)際執(zhí)行的 cvs 命令,
這些命令往往帶有一些參數(shù),如何修改這些參數(shù)呢?就通過給
pcl-cvs 的命令
加前綴 C-u。一般的,一個(gè) C-u 只改變當(dāng)前命令所用的 cvs 選項(xiàng),如果前綴兩
個(gè)
C-u,則是永久改變所用選項(xiàng)。
例如,d d 缺省比較當(dāng)前拷貝和庫中你check out時(shí)的修訂版。
如果用
C-u d d 會提示輸入 cvs 的選項(xiàng),此時(shí)你可以給任意的 cvs diff
選項(xiàng),用以進(jìn)行各種各樣靈活的比較。比如,輸入 -r1.10
-r2.3 RET,此
次比較的就是源碼庫中當(dāng)前文件修訂版 1.10 和 2.3 之間的區(qū)別。
如果 C-u
C-u d d,輸入 -r1.10 RET,以后的 d d 命令都會帶著 -r1.10
仿佛永久修改了默認(rèn)選項(xiàng)。當(dāng)然,可以再 C-u C-u
d d 修改回去。
再如,cvs add 命令添加二進(jìn)制文件需要 -kb 選項(xiàng),用 C-u a 則提示輸入cvs
add
flags,輸入 -kb RET,OK。
6. 查看一些信息
在一個(gè)文件或目錄上,或標(biāo)記了一些文件,按 l 可以在
*cvs-info* 緩沖中看
到這些文件的 log 信息,就是提交到源碼庫中的更新日志;按 s 可以看到狀態(tài)
信息;按 +
也是狀態(tài)信息,但是 tag 表為樹型結(jié)構(gòu)。
按 l 查看 log 信息時(shí),*cvs-info* 緩沖的狀態(tài)為 (Log-View
CVS)。此時(shí),有
很多方便的操作,比如比較兩個(gè)修訂版之間的不同,修改源碼庫中的 log 信息,
打開某個(gè)文件任意的修訂版。比如,在
*cvs* 的某個(gè)目錄上面按了 l,然后轉(zhuǎn)
到 *cvs-info* 緩沖中,這里面列出的時(shí)該目錄中所有文件的 log 信息,此時(shí)
的常用命令如下。
n, p 移動(dòng)光標(biāo),在一個(gè)文件內(nèi)的不同修訂版之間
N,
P 移動(dòng)光標(biāo),在不同的文件之間,M-n, M-p 同樣
m 設(shè)置 mark
d
和設(shè)置 mark 的那個(gè)修訂版進(jìn)行 diff
e 修改當(dāng)前 log,編輯完,C-c C-c
提交
f, o, RET
這幾個(gè)都是打開當(dāng)前的修訂版,稍有區(qū)別。用 f
的時(shí)候如果提示
vc-find-version 沒有定義,手工加載一下 vc 庫
M-x
load-library RET vc RET。
z 關(guān)閉該緩沖
如果在 *cvs* 的目錄里按
s,此時(shí)的 *cvs-info* 緩沖為(CVS-Status CVS)狀
態(tài),在這個(gè)緩沖中,也可以做類似的一些操作:
N, P 在文件之間移動(dòng), M-n, M-p 同樣
n, p 上一行,下一行
f, o,
RET
把光標(biāo)移動(dòng)到某個(gè) tag 的名字上,則可以直接打開那個(gè) tag
所在
的修訂版
T, t 把每個(gè)文件所列的 tag 表轉(zhuǎn)為樹型結(jié)構(gòu),T 為橫向的樹,t
為豎向
的樹
diff 命令產(chǎn)生的 *cvs-diff* 緩沖中也類似,N/P 在文件之間移動(dòng),n/p
在不
同的 diff 之間移動(dòng)。此外,在任何一行代碼的未知按 o 或 RET 可以直接轉(zhuǎn)到
文件中的實(shí)際未知,很方便的。
7. Emacs 的 VC 的方便之處
在 PCL-CVS 中,幾乎可以做任何 CVS
相關(guān)的操作。但有時(shí)候未免有些麻煩,配
合 Emacs 的 VC (Version Control) 會方便很多。
Emacs 的
VC 模式的作者就是著名的 Eric S. Raymond。VC 的功能很強(qiáng)大,而
且方便靈活??梢允褂迷谌N版本管理系統(tǒng)中:RCS、CVS、SCCS,操作方式一致。
和 PCL-CVS 不同的是,VC 使用 C-x v
前綴完成大部分功能,不像PCL-CVS 使
用一個(gè)主界面,這使 VC 顯得更方便。
幾個(gè)主要的命令:
C-x
v
v vc-next-action
顧名思義,執(zhí)行下一個(gè)動(dòng)作,下一個(gè)動(dòng)作是什么就執(zhí)行什么,如果
是
Unknown 就 cvs add,如果是 Modified 就 commit,如果是
Up-to-date
就什么都不用做了。最方便的是只需在當(dāng)前 buffer 中
執(zhí)行。
C-x v
m vc-merge
將庫中別人所做的改動(dòng)與本地的改動(dòng)合并,和庫中的版本保持一致。
C-x v
a vc-update-change-log
更新更改日志文件
ChangeLog。如果源碼庫或本地拷貝中還沒有,
試一下這個(gè),它會根據(jù) cvs 的提交日志,自動(dòng)產(chǎn)生
ChangeLog,如
果已經(jīng)有了,但已經(jīng)有一段時(shí)間沒有更新過,它會自動(dòng)更新
ChangeLog
文件到最新的一條記錄。
C-x v
~ vc-version-other-window
PCL-CVS
也可以方便的查看某個(gè)歷史版本,不過都需要轉(zhuǎn)到相應(yīng)的
控制界面(*cvs* 或 *cvs-info* buffer)中。而 VC
的這個(gè)命令可
以在當(dāng)前緩沖中用,會提示輸入版本號,然后顯示在另一個(gè)窗口中,
并保存在當(dāng)前目錄,文件名為
FILENAME.~REV~。
有時(shí)候,用 CVS 管理的東西不需要整體的控制,比如自己的筆記、隨筆之類,
用 Emacs
設(shè)置上 bookmark,打開就寫點(diǎn),寫完馬上就提交,往往不必打開
PCL-CVS,恰恰 VC 這些靈活的命令非常合適。
繼續(xù)了解 VC:
C-x v
= vc-diff
比較文件。如果用了前綴參數(shù),會詢問和哪個(gè)文件的哪個(gè)版本比較。
C-x v
u vc-revert-buffer
放棄沒有提交的改動(dòng),恢復(fù)原狀,也就是你的本地拷貝的版本,并
不管庫中的最新改動(dòng)。如果想同時(shí)和庫中別人所做的改動(dòng)保持一致,
用
C-u 作為前綴參數(shù)。
C-x v
g vc-annotate
看看你的每行代碼的狀態(tài)(編輯歷史)。每行的顏色用來表示這行代
碼的新舊程度,藍(lán)色的時(shí)間最長,紅色的最短,其他的居中。默認(rèn)
的最長時(shí)間為一年,超過一年的都顯示為藍(lán)色。用前綴參數(shù)可以修
改所顯示的版本和默認(rèn)最長時(shí)間。
這個(gè)緩沖中還有一些有趣的功能,可以直接轉(zhuǎn)到某個(gè)修訂版。每行
的最前面為當(dāng)前行最后一次修改的修訂版,在這行上按
J,整個(gè)緩
沖中的內(nèi)容全都替換為這個(gè)修訂版;按 N (或 P)
為緩沖中當(dāng)前的
后一個(gè)(前一個(gè))修訂版;按 A
轉(zhuǎn)到當(dāng)前行上次被修改的版本。N/P
按修訂版歷史瀏覽,A 按當(dāng)前行修改歷史瀏覽,J
跳轉(zhuǎn)該行所指修
訂版,W
回到該文件的當(dāng)前修訂版。注意,模式行上文件名的后面
標(biāo)注了緩沖當(dāng)前內(nèi)容的修訂版。另外,D
可以比較當(dāng)前行上的修訂
版和前一修訂版的區(qū)別,N/P 可以使用前綴參數(shù)。
C-x v
d vc-directory
打開一個(gè)帶版本控制功能的 Dired buffer,功能和 pcl-cvs
的
*cvs* buffer 有些類似?;蛟S對非 CVS 的版本管理比較有用。
8.
相關(guān)配置
由 CVS 管理的模塊中都有 "CVS" 目錄,打開 cvs-dired-use-hook 時(shí),在
"CVS"
目錄上按 F,直接進(jìn)入該模塊的 *cvs* buffer:
(setq cvs-dired-use-hook 'always)
給 cvs-examine 一個(gè)方便的綁定:
(define-key global-map "\C-xve"
'cvs-examine) 綁定到 C-x v e。
Trackback:
http://tb.donews.net/TrackBack.aspx?PostId=59395