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。