1. Introduction
B. Using Version Control with Makefile
將 test.c 更新的內容當成另一個版本( revision 1.2 )寫入 archive file 中。當 archive file 中存入兩個版本以上時, 則指令 co test.c 將取出 test.c 最後存入的版本; 若欲取出 test.c 的版本 1.1 則需使用 :
其中 -r 後可接欲取出版本的 revision number, 來指定 co 從 archive file 中取出哪一個版本。
其中用 -f 來強迫 RCS 以寫入相同版本內容來產生下一個版本。
(1) check in 時 RCS 會自動要求輸入:
但是如果是第一次 check in( creat archive file) 則會是下列訊息:
在此時要求輸入的並非附記( log ), 而是對整個檔案的描述( description )
(2) 使用指令 ci -m"comment_file":
對於檔案 test.c 各版本所產生的附注( log ), 可以使用指令:
取得各版本附注( log )的一覽表, 如下:
也可以利用加參數( option ) -r 來指定取得個別版本的附注:
keyword | 相關資訊 |
$Header$ | 全路徑名(full pathname)+日期(date)+作者(author)+描速(state)+正 lock 該檔案者(locker) |
$Id$ | RCS 檔名+日期(date)+作者(author)+描速(state)+目前 lock 住該檔案者(locker) |
$Date$ | 日期 |
$Log$ | 關於該版本的 log 的訊息 |
$Author$ | 作者 |
$locker$ | 目前 lock 住該檔案者 |
$revision$ | revision number |
$source$ | 全路徑名(full pathname) |
(1) 識別關鍵字串( IdKeyword )該加在何處?
(2) RCS 如何來解釋各個識別關鍵字串( IdKeyword )?
利用這些參數可以令 RCS 依照不同的方式來解釋識別關鍵字串( IdKeyword ), 以下是相關的的參數列表( option ):
Option | 解釋方式 | 說明 |
-kkv | keyword 本身 + 相關資訊 | 這是 default 的解釋方式如上最後第二個例子 |
-kkvl | keyword 本身 + 相關資訊 + locker | 如 -kkv 再加上 lock 該檔者 |
-kk | keyword 本身 | 只示 keyword 本身 不加解釋 |
-kv | 相關資訊 | 只示相關資訊不加 keyword 本身 |
(1)識別關鍵字串( IdKeyword ) 的檢視:
(2)識別關鍵字串( IdKeyword ) 的利用:
分別敘述如下:
產生出來的標記符號( mark symbol )可以用 rlog 指令看到:
一個版本可以有多個標記符號如欲在版本 1.2 處產生標記符號 r1_0 及 r1_0_head 則使用指令:
如欲取消版本 1.2 的標記符號 r1_0 則使用指令:
分別說明如下:
(1) 幫助辨視檔案版本:
(2) snapshot 的建立:
(1) 目前工作檔案與最近儲存版本的比較:
都不指定版本時, rcsdiff 會比較目前工作檔案( working file )與最近儲存的版本。所謂的最近儲存的版本是指主幹( default branch )上最後存入的一個版本。
(2) 目前工作檔案與任一版本的比較:
可以用 -r" 來指定欲比較的版本跟目前工作檔案比較。
(3) 任意兩個版本的比較:
比較兩個任意的版本。
(2) 使用指令 co -j :
也可以一次整合多個檔案的相異處, 例如欲將 1.2 和 1.2.1.1 的不同處與 1.3 和 1.3.1.1 的不同處跟 1.4 整和起來時, 則使用指令:
加入的 access list 可以用指令 rlog 看到:
若欲將使用者 jhchen 從 access list 中去除, 則使用指令:
若欲將檔案 test.c 的 access list 全部清除除, 則使用指令:
指令 | 使用參數 | 說明 |
ci (check in) | 產生或寫入 archive file | |
-d"date" | 給定版本生成時間 | |
-f | 強制產生新版本(不管是否寫入相同版本內容) | |
-w"name" | 給定生成該版本的作者名 | |
-m"log-file" | 直接以檔案的形式寫入附記( log ) | |
-n[symbol] | 在寫入 archive file 同時, 給定標記符號( mark symbol ) | |
-r[number] | 寫入時指定版本的 rivision number | |
-t"description" | 直接以檔案的形式寫入描述( description ) | |
-l | 寫入後再取出該版本為工作檔案( lock ) | |
-u | 寫入後再取出該版本為工作檔案( unlock ) | |
co (check out) | 從 archive file 讀出工作檔案 | |
-d[date] | 取出在指定時間前最後生成的版本 | |
-f | 強制取出版本內容取代目前工作檔案 | |
-j | 取出並整合指定的版本內容 | |
-l | lock 取出版本 | |
-p | 取出版本內容至標準輸出( standard output ) | |
-r[number] | 指定取出版本 | |
-w[name] | 取出指定作者名之版本 | |
-u | 取出 unlock 的版本內容 | |
rcs | -A[file] | 將其它檔案的可存取名單寫入該檔的可存取名單 |
-a[name] | 將使用者寫入可存取名單 | |
-b[branch number] | 設定主支( default branch ) | |
-e[name] | 將使用者自可存取名單內剔除 | |
-l[number] | lock 該版本但不取出 | |
-m | 更改檔案版本的附注( log ) 的內容 | |
-n[symbol] | 產生或去除標記符號( mark symbol ) | |
-o[number] | 從檔案的 archive file 中移除某版本 | |
-t | 改檔案版本的描述( description ) 的內容 | |
-u[number] | 去除該版本 lock 的狀態 | |
rcsclean | 清除 unlock 的工作檔案 | |
-n | 顯示命令列但不執行 | |
-u | 清除工作檔案 | |
rcsdiff | 比較版本內容的差異(包括 IDKeyword) | |
-kk | 比較版本內容的差異(不包括 IDKeyword) | |
-kkvl | 指定 IDKeyword 的比較方式 | |
-r | 指定欲比較版本 | |
rcsmerge | -r | 整合檔案版本(包括 IDKeyword) |
-kk | 整合檔案版本(不包括 IDKeyword) | |
-kkvl | 指定 IDKeyword 的整合方式 | |
rlog | 列出檔案各版本附記(log)一覽表 | |
-b | 列出檔案主分支( default branch )的附記(log)一覽表 | |
-h | 列出檔案附記(log) 的標頭(header) | |
-L | 若該檔友被 lock 則列出各版本附記(log)一覽表 | |
-R | 列出檔案的 archive file 路徑與名稱 | |
-t | 列出檔案附記(log)的標頭(header)+ 描述(description) |
分別說明如下:
(1) 安排工作程序中檔案間的關係, 並做檔案 time-dependence 的檢查:
否則將不再重新編譯 pf.c 檔, 直接以現存的 pf.o 檔供鏈結。
(2) 巨集的使用:
執行指令 make clean 時, 相當於執行下面的兩行指令:
利用這些 target 可以得到下面的工作程序圖:
Objs = pf.o
VCFILES= pf.c $(Lib)
Lib= $(LPATH)cal.o
FILES=$(VCFILES)
REVISION = 1.1 1.2
revision_f.c=
revision_cal.o=
LPATH= lib/
view :
-----------------------------------------------
(2)利用目錄( directory )為工作單位
(3)藉由變數的設定來調整工作環境
分別說明如下:
(1) 檔案尚未產生 archive file :
然後會在 emacs 下方出現下面訊息:
要求指定欲更改的變數。此時便可鍵入變數 vc-keep-worfiles , 然後會再出現下列訊息:
則鍵入 nil, 如此可令 Emacs 在寫入archive file ( check in )之後, 自動移除( remove )原先的工作檔案( working file )。
(2) 編輯檔案已存在 archive file :
其中 %% 符號表示唯讀, (RCS : 1.2) 顯示用 RCS 做 VC 而版本編號( revision number )為 1.2。
(1) 檔案的讀取:
(2) 編輯時檔案狀態的改變:
(3) 存入或取消編輯後的版本:
然後會在 emacs 下方出現下面訊息:
要求指定欲更改的變數。此時便可鍵入變數 vc-initial-comment , 然後會再出現下列訊息:
則鍵入非 nil 的值。如此則在第一次 check-in 時就會要求輸入初始版本的附記( log )。
如果要取消某個已存入 archive file 的版本, 則使用:
可以將目前在 buffer 的版本從 archive file 中去除, 而以下一個最近的版本取代之。
(1) 檔案各個版本之附記 log 的取得:
獲得對於該檔案各版本的附記( log )一覽表, 如下所示:
將一般檔案的變更記錄加入 ChangeLog 檔中。
會在 emacs 的視窗上出現如下(vc-diff)的顯示區, 顯示比較的結果:
然後依序照要求輸入檔名及欲比較版本名。
則會出現以下訊息:
要求輸入欲給定的符號名( symbol ), emacs 會以該輸入的符號名( symbol )做為目錄下各檔最後存入版本的標記符號( mark-symbol )。此標記符號( mark-symbol ) 產生的方式是針對目錄下所有檔案的最後一個版本, 同時產生相同的標記符號( mark-symbol ), 所以 emacs 是以 目錄 作為工作單位, 用目錄來區分檔案之間的關係, 因此在產生 Snapshots 的同時, 目錄下不可有被 lock 的檔案版本存在, 如此可以確保在產生 Snapshots 之時, 所有檔案存入的最後一個版本就是要產生 Snapshots 的版本。
在 emacs 視窗的下方會出現:
則 emacs 會在 cusor 所在的地方, 產生預先設定的識別關鍵字串( Idkeyword )。這個預先設定的識別關鍵字串( Idkeyword )其 default 值是 %ID%( SCCS 為 %W%) 字串, 這個 default 的設定可藉由變數 vc-header-alist 更改。
(1) 進入 emacs 後才改:
然後會在 emacs 下方出現下面訊息:
要求指定欲更改的變數。此時便可鍵入變數 vc-header-alist , 然後會再出現下列訊息:
如果欲將 vc-header-alist 改成 $Date$ ( default 是 $Id$), 則需鍵入:
即可將變數 vc-header-alist 改成 $Date$。上述的設定模式類似 lisp 的語法, 針對 RCS 而設立。 變數 vc-header-alist 的完整設定為 '(( SCCS \%W\% )(RCS \$Id\$ )(CVS \$Id\$ )
(2) 在 .emacs 檔中設立:
則在一開始進入 emacs 時, 便會將變數 vc-header-alist 設成 $Date$。
(1) 在未進入 VC mode 之前 :
function | hot key | 說明 |
vc-register | C-x v i | 產生 archive file 並進入 VC mode |
vc-rename-file | 更改檔案名稱 | |
vc-retrieve-snapshot | C-x v r | 指定 snapshot 取出檔案版本 |
vc-toggle-read-only | C-x C-q | 切換檔案讀寫狀態 (Check-in 與 Check-out 的動作) |
vc-update-change-log | C-x v a | 將檔案變更記錄寫入 Changelog |
(2) 在進入 VC mode 之後 :
function | hot key | 說明 |
vc-cancel-version | C-x v c | 取消該版本 |
vc-create-snapshot | C-x v s | 對目錄下所有做 vc 檔案的最後一個版本產生 snapshot |
vc-diff | C-x v = | 比較目前工作檔案與最後存入版本之差異 |
vc-directory | C-x v d | 出示目錄下被 lock 的檔案並進入 dired mode |
vc-insert-headers | C-x v h | 插入標頭檔 |
vc-next-action | C-x v v | 進行下一個 vc 的動作 |
vc-print-log | C-x v l | 取出該檔案的 log 檔 |
vc-revert-buff | C-x v u | 取消更動版本內容 |
vc-version-other-window | 以新的檔案名編輯檔案版本 |
function | hot key | 說明 | |
vc-comment-search-forward | 搜尋以後各版本 log 檔的內容 | ||
vc-comment-search-reverse | 搜尋以前各版本 log 檔的內容 | ||
vc-comment-to-change-log | 加變耕記錄於 ChangeLog 檔 | ||
vc-directory-18 | 檢查所屬目錄下被 lock 的檔案 | ||
vc-ediff | 利用 diff 檔支援編輯檔案 | ||
vc-finish-logentry | C-c C-c | 結束 log 檔的編輯 | |
vc-next-comment | 循環向後讀出版本的描速 | ||
vc-previous-comment | 循環向前讀出版本的描速( log ) | ||
vc-revert-buffer1 | 將 auto-save 的檔案內容存入目前 buffer | ||
vc-steal-lock | 奪取檔案寫入權利 | ||
vc-version-diff | 指定檔案與檔案內之版本做比較 |