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 控制命令。每執(zhí)行一次,Emacs
會在緩沖
底部顯示對應的 cvs 命令,以供參考。
3. 在 cvs 緩沖中常用的命令
n, p
移動光標。
f, o, RET 打開當前文件。
M-s 列出所有文件的當前狀態(tài)。
x 在緩沖中去掉所有是 Up-To-Date 的狀態(tài)的文件,這樣比較干凈。
M-u 更新本地拷貝。
U 放棄所做的改動,小心別把你沒有提交的工作弄沒了。
m 標記文件,用于對多個文件同時操作。u
去掉標記并下移;Backspace
去掉標記并上移;M-Backspace 同時去掉 buffer 中所有標記。%
用正
則表達式標記文件。
c 準備提交所做的改動,會彈出一個 *cvs-commit*
緩沖,用來寫修改的
日志,寫完完按 C-c
C-c,執(zhí)行提交。如果有標記,同時對所標記的所
有文件相庫提交。
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
命令查看文件或目錄的狀態(tài),會彈出一個漂亮的
*cvs-info* 緩沖,列出文件的狀態(tài)信息。
z, q 關閉
*cvs* 緩沖。
4. cvs buffer 中幾種狀態(tài)的說明(括號中是此時可能需要用到的命令):
cvs buffer
中按一下 M-s 可以列出所有文件。每個一行,分別列出了當前的
CVS 狀態(tài)、修訂版和文件名。
"Up-to-date"
文件和庫中文件一致,也就是說,目前是最新的修訂版,而且沒
有被改動過。(按 f 或 RET,進入文件進行編輯,l 看修改歷史,+ 看 tag
信
息)
"Need-Update" 文件相對于源碼庫,不是最新的,需要更新。(M-u 更新,d h
比較當前文件和源碼庫中的區(qū)別)
"Modified" 文件已經被改動過,但還沒有提交到源碼庫。(c/C 提交,d d 比
較,d
e 用 ediff 比較,U 放棄修改,小心使用)
"Added" 用 cvs add
命令新添加的文件,添加了新文件只在本地有效,需要提
交到源碼庫。(c/C 提交)
"Removed" 用 cvs 的
remove 命令刪除的文件,同 add 一樣,需要提交到源碼
庫。(c/C 提交)
"Needs-Merge"
你編輯文件的時候,別人又向源碼庫提交過,因此本地的改動,
和源碼庫中的需要合并。(先 M-u 更新,如果發(fā)生沖突,手工修改,再 c/C
提
交,d b 和原來的備份比較,d h 和庫中比較)
"Conflict"
你的提交和源碼庫中當前的狀態(tài)有沖突,需要手工修改,并再提交
一次。(手工修改,再 c/C 提交)
"Unknown"
源碼庫中沒有該文件,這或許不是你想要的,或許是剛剛新建的。
(如果想讓 cvs 忽略此文件,按 i;想添加到源碼庫,按 a,再提交;用 r
刪
除)
"Missing" 源碼庫中有,可是本地拷貝中卻沒有了。(M-u 更新,可以從新從源
碼庫得到拷貝)
5. 用 Emacs 的前綴參數修改 cvs 命令的選項
很多 cvs
命令可以給一個前綴參數,改變缺省的行為。多數的前綴參數都是
C-u,而多數改變的行為,就是修改傳遞給 cvs 的默認選項。
每執(zhí)行一次操作,pcl-cvs 的 *cvs* 緩沖底部都會顯示實際執(zhí)行的 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 之間的區(qū)別。
如果 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 可以看到狀態(tài)
信息;按 +
也是狀態(tài)信息,但是 tag 表為樹型結構。
按 l 查看 log 信息時,*cvs-info* 緩沖的狀態(tài)為 (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
這幾個都是打開當前的修訂版,稍有區(qū)別。用 f
的時候如果提示
vc-find-version 沒有定義,手工加載一下 vc 庫
M-x
load-library RET vc RET。
z 關閉該緩沖
如果在 *cvs* 的目錄里按
s,此時的 *cvs-info* 緩沖為(CVS-Status CVS)狀
態(tài),在這個緩沖中,也可以做類似的一些操作:
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
顧名思義,執(zhí)行下一個動作,下一個動作是什么就執(zhí)行什么,如果
是
Unknown 就 cvs add,如果是 Modified 就 commit,如果是
Up-to-date
就什么都不用做了。最方便的是只需在當前 buffer 中
執(zhí)行。
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 這些靈活的命令非常合適。
繼續(xù)了解 VC:
C-x v
= vc-diff
比較文件。如果用了前綴參數,會詢問和哪個文件的哪個版本比較。
C-x v
u vc-revert-buffer
放棄沒有提交的改動,恢復原狀,也就是你的本地拷貝的版本,并
不管庫中的最新改動。如果想同時和庫中別人所做的改動保持一致,
用
C-u 作為前綴參數。
C-x v
g vc-annotate
看看你的每行代碼的狀態(tài)(編輯歷史)。每行的顏色用來表示這行代
碼的新舊程度,藍色的時間最長,紅色的最短,其他的居中。默認
的最長時間為一年,超過一年的都顯示為藍色。用前綴參數可以修
改所顯示的版本和默認最長時間。
這個緩沖中還有一些有趣的功能,可以直接轉到某個修訂版。每行
的最前面為當前行最后一次修改的修訂版,在這行上按
J,整個緩
沖中的內容全都替換為這個修訂版;按 N (或 P)
為緩沖中當前的
后一個(前一個)修訂版;按 A
轉到當前行上次被修改的版本。N/P
按修訂版歷史瀏覽,A 按當前行修改歷史瀏覽,J
跳轉該行所指修
訂版,W
回到該文件的當前修訂版。注意,模式行上文件名的后面
標注了緩沖當前內容的修訂版。另外,D
可以比較當前行上的修訂
版和前一修訂版的區(qū)別,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