2010年2月7日 星期日

SCCS工具

SCCS Source Code Control System 的簡寫。適合用來管理同一個檔案的不同版本。尤其是程式碼已做了修改,但現有系統必須繼續運行時,SCCS 可提供十分完整的管理功能。

對某個檔案所做的修改都放在一個叫 s.file 的檔案中。這個檔案稱為 SCCS 檔。每一次這個檔案 " 放入 "SCCS 中,SCCS 就會去記錄和上次不同的地方,有哪些行更改過或 是刪除了等等。有了這些資料,SCCS 就可以馬上產生所需的檔案。每次更改都會參考到上一次的更改記錄。

每組更改過的檔案叫做一個 deltaSCCS 會指定一個 SCSS id 字串(sid)給它。sid 可能是一組兩個的資訊,release level 號碼,或是含有一組四個的資訊,包括 releaselevelbranchsequence numbers 四種。(譯按: 在此的名稱就延用原文,不另外將 sequence number 譯為序號等等)。若同時有兩份檔案在線上使用,就會用到 branch sequence 這兩個編號。如 delta 3.2.1.1 表示 release 3level 2branch 1sequence 1


指令概說

SCCS 分為以下幾類:

基本設定和編輯

admin              建立新的 SCCS 檔案或改變其參數。
get              取出指定版本的 SCCS 檔案。
delta              建立新版的 SCCS 檔案(加上一個新的 delta)。
unget              取消 get 指令的動作 ; 不建立新的 delta

delta 管理

cdc              修改 delta 相應的註解。
comb              將連續的 delta 合併成一個 delta
rmdel              將不小心造出的 delta 刪除。

查詢

help              印出指令用法或是解釋錯誤訊息。
prs              SCCS 檔案的一部份以指定格式印出。
sact              顯示 SCCS 檔案的更動記錄。
what              搜尋 %Z% 所替代的字串然後印出其後的文字。

比較檔案

sccsdiff              比較兩個 sccs 檔案的差異。
val              確認某個 SCCS 檔案。




基本操作方式

本節的解說順序依照 SCCS 的操作順序排列:

. 建立 SCCS 檔案
. 取出檔案
. 建立新的 release branch
. 記錄更動的部份

------------------------------------------------------


建立 SCCS 檔案

admin 指令加上 -i 選項可以建立新的 SCCS 檔案。例如:

admin -ich01 s.ch01

這個指令會建立一個新的 SCCS 檔案,內容則指定為 ch01 的內容,這個就變成 delta 1.1。若不加上任何關鍵字參數,則會顯示 "No id keywords(cm7)"。大致上來說,關鍵字就是在get 時,會由 get 置換成適當的值,用來做識別用的資訊。識別用關 鍵字在本章後面會詳細解說。

建立 s.ch01 後,原來的 ch01 就可以刪除了,因為只要用 get 指令就可以輕易取得。


------------------------------------------------------


取出檔案

get 指令可以從 SCCS 中取得任一版本的檔案。比如要取出上一個範例中 的檔案,可用下列指令:

get -e s.ch01

然後輸出訊息如下:

1.1
new delta 1.2
272 lines

這表示取出的是 1.1,取出的檔案中有 272 行文字。若再用 delta 指令把 ch01 放入SCCS檔案 s.ch01 時,delta 就會變成 1.2

-e 選項表示取出的檔案經過編輯修改後要再 " 放入 "SCCS" 中。若不加上這個選項,取出的檔案就是唯讀的。-e 選項除了將檔案設定為可讀寫外,還會建立一個 p.ch01 檔案,用來記錄一些重新放入 SCCS 時所需的資訊。



------------------------------------------------------

p17-4


建立新的 release branch

-r 選項可讓 get 指定取出某個版本的檔案,但若不指定 level 號碼,則預設為取出 level號碼最大的那個版本。比如:

get -r3.2 ch01

會取出 3.2 版的 ch01 檔案,但下面的這個指令:

get -r3 ch01

會取出 3.x 版中,x 最大者,比如說 3.8。不加上 -r 選項的話,預設為取出最新的版本,也就是號碼最 大的版本。

當大部份的修改都已儲存起來後,使用者或許會想 要另起爐灶推出一個新的 release。這時可以用 get 來取得比目前 release 1 release 號碼。比如,若最新的檔案是 3.2 版,而要新建立一個 release 4 的檔案,則可使用:

get -e -r4 ch01

訊息顯示如下:

3.2
new delta 4.1
53 lines

若要修改前幾版的檔案,則可使用下列指令:

get -e -r2.2 ch01

然後訊息顯示如下:

2.2
new delta 2.2.1.1
121 lines

這樣就從原有的檔案版號中建立了新的 branch。也就是從 2.2 延伸出去的 2.2.1.1。不過這個 delta 所做的修改不會影響原有的版本,如 2.33.2 等等。


------------------------------------------------------

記錄更動的部份

修改過檔案後,用下列指令把檔案 " 送入 "SCCS 中:

delta s.ch01

然後系統會提示使用者打入修改的註解。delta 指令接著會執行自己的 get diff 來將修改過的檔案和目前最新的檔案來做比較。然 後印出新的版號以及修改的行號等等資訊。



------------------------------------------------------

識別關鍵字

下列關鍵字可以放在 SCCS 檔案中。get 指令會將適當的值替代進檔案中。

%A%              what 字串的縮寫
              %A%=%Z%%Y% %M% %I%%Z%
%B%              Branch 號碼。
%C%              目前行號,可用來找出錯誤所在。
%D%              日期(YY/MM/DD)。
%E%              最新的 delta 建立日期(YY/MM/DD)。
%F%              SCCS 檔案名稱。
%G%              最新的 delta 建立日期(MM/DD/YY)。
%H%              日期(MM/DD/YY)。
%I%              取出檔案的 sid%R%.%L%.%B%.%S%)。
%L%              Level 號碼。
%M%              模組名稱(檔名去掉 s.)。
%P%              完整的 SCCS 檔案名稱。
%Q%              string的值,以 admin -fqstring 所定義。
%R%              release 號碼。
%S%              sequence 號碼。
%T%              目前時間(HHMMSS)。
%U%              最新的 delta 建立的時間(HHMMSS)。
%W%              另一個縮寫
              %W%=%Z%%M%tab%I%
%Y%              模組的型態(type),由 admin -fttype 所定義。
%Z%              what 所認得的字串,也就是 @(#)



資料關鍵字

資料關鍵字是用來選 SCCS 檔案的一部份,可用 prs -d 選項輸出。

:A:              what 字串的格式。
:B:              branch 號碼。
:BD:              內文。
:BF:              branch 旗標。
:C:              delta 的註解。
:CB:              上界。
:D:              delta 建立日期(:Dy:/:Dm:/:Dd:)。
:Dd:              delta 建立日期。
:Dg:              忽略的 deltasequence 號碼)。
:DI:              delta sequence 號碼(:Dn:/:Dx/:Dg:)。
:DL:              delta 行狀態 (:Li:/:Ld:/:Lu:)。
:Dm:              建立 delta 的月份。
:Dn:              包括進來的的 deltasequence 號碼)。
:DP:              上一個 delta sequence 號碼。
:Ds:              預設 sid
:DS:              delta sequence 號碼。
:Dt:              delta 資訊。
:DT:              delta 種類。
:DX:              排除在外的 deltasequence 號碼)。
:Dy:              delta 建立的年份。
:F:              SCCS 檔名。
:FB:              下界。
:FD:              檔案描述。
:FL:              旗標表。
:GB:              get 進來的本文。
:I:              SCCS ID 字串(sid)(:R:.:L:.:B:.:S:)。
:J:              合併編輯旗標。
:KF:              關鍵字錯誤 / 警告旗標。
:KV:              關鍵字確認旗標。
:L:              level 號碼。
:Ld:              delta 刪除的行號。
:Li:              delta 插入的行號。
:LK:              鎖定的 release
:Lu:              delta 未更動的行號。
:M:              模組名稱。
:MF:              確認更動旗標。
:MP:              確認更動的程式名稱。
:MR:              delta 的更動號碼。
:ND:              Null delta 旗標。
:P:              建立 delta 的使用者名稱。
:PN:              SCCS 檔案路徑。
:Q:              使用者定義的關鍵字。
:R:              release 號碼。
:S:              sequence 號碼。
:T:              delta 建立的時間。
:Th:              delta 建立時的時。
:Tm:              delta 建立時的分。
:Ts:              delta 建立時的秒數。
:UN:              使用者名稱。
:W:              what 字串的格式。
:Y:              模組型態旗標。
:Z:              what 字串的分隔字元。


------------------------------------------------------


指令解說

SCCS 的檔名參數可以是檔名或是目錄名稱。若給定目錄名 稱,則目錄內所有可讀可處理的檔案都會予以處理。若以 "-" 來代替檔名,則 SCCS 會從標準輸入來讀入所要處理的檔名。



--------------------------------------
admin [options] files

files 檔案加到 SCCS 或是改變 files options 選項。

Options

-a[user | groupid]
              指定 user groupid 可以製作 delta。若 user groupid 前加上 "!",則表示不准製作 delta。若不指定可用或不可用的 user groupid,則全部的使用者都可以製作 delta
-dflag              -f 所設定的旗標清除。旗標如下:
              b              get 指令的 -b 選項打開,可以建立 branch
              cn              將最高的 release 設定為 n(預設為 9999)。
              dn              get 預設的 delta 號碼設定為 n
              fn              將最低的 release 號碼設定為 n(預設為 1)。
              i[string]
                            "No id keywordsge6)" 視為嚴重錯誤。若指定 string,則若關鍵字不符合 string時為嚴重錯誤。
              j              可同時進行多個 get
              llist              list 中的 release 不可更改。用 a 來指定所有的 release
              mname              %M% 以模組名稱 name 代替之。
              n              建立一個 null delta,由此來建立新的 branch
              qstring              將關鍵字 %Q% string 代替。
              ttype              %Y% 以模組類型 type 代替。
              v[prog]              強迫使用者在輸入確認更動號碼,用 於建立新 delta 的原因。用 prog 程式來顯示確認更動號碼。

-e[user | groupid]
              列出的 user 或是 groupid 不可建立 delta
-fflag              設定旗標(見 -d)。
-h              檢查 SCCS 檔案是否有損毀。
-i[file]
              file 的內容新建立一個 delta。若無 delta,則使用標準輸入。
-m[list]
              list 所指定的確認更動號碼當做建立檔案的原因。
-n              建立一個新的空白 delta
-rn.n              delta release 初值設定為 n.n。預設為 1.1。必須和 -i 一起使用。
-t[file]             
              SCCS 檔案描述以 file 的內容代替。若無 file 參數,則目前的描述會自動刪除。
-y[text]             
              text 做為初始資料的註解。(僅可用於 -i -n)。
-z              重新計算 SCCS checksum,然後存於第一行。


--------------------------------------
cdc -rsid [options] files

修改檔案指定 sid 的註解。

Options

-m[list]              加入 list 中的更動要求號碼。(在號碼之前加上 "!" 可刪除該號碼)。-m 只有在 admin 指令使用 -v 選項的時候有用。若不加上 -m,則終端機上會顯示 MRs? 要求你輸入。
-y[string]              string 加到指定資料的註解中。若不加上 -y,則會顯示 comments? 要求你輸入。

範例:
s.prog.c delta 1.3 中加上 x01.5 x02-8 兩個更動號碼,然後加上註解:





--------------------------------------
comb [options] files

將指定的 SCCS 檔案予以合併。這個指令會只保存每個 branch 中最新的版本,然後把前面不必要的檔案都予以除 去,只留下最新版所需的檔案。comb 會產生一個 shell script,真正的合併過程是由這個 script 來進行的。

Options

-clist              只將 list 中以 "," 分開的幾個 SCCS 檔案保留下來。可用 "-" 來指定範圍。比如1.3.2.1-2.5
-o              將重建後的 file 檔案以 delta 建立時的版本號碼存取,而非最新版的版號。這個 動作可能會影響到樹狀結構。
-psid              重建 file 的過程中,SCCS 識別字串早於 sid delta 都予以刪除。
-s              建立一個 script,用來計算總共縮小的檔案大小。-s 可用來預測 comb 實既上執行時的動作。


--------------------------------------
delta [options] files

將一個或多個 SCCS 的加入修改的動作。delta 可用來儲存用 get -e 取出,編輯完成後要儲存的更改。delta 通常將更改過的文字檔刪除,保留 SCCS 的檔案。

Options

-glist              list 中所指定的 SCCS ID(用 "," 分開)的檔案予以略過。用 "-" 來指定範圍,如 1.2,2.1-2.5
-m[list]              加入 list 中的更動要求號碼。(在號碼之前加上 "!" 可刪除該號碼)。-m 只有在 admin 指令使用 -v 選項的時候有用。若不加上 -m,則終端機上會顯示 MRs? 做為提示符號。
-n              不要將更動過的文字檔(用 get -r 取出後修改的)刪除。
-p              印出 diff 式的 file 檔案更動記錄。
-rSID              file delta 版本號碼。只有一次編輯數個不同版本的 file 時才會使用 -r
-s              不印出新的 SID 和其他資料。
-y[string]
              string 當做建立 delta 的原因。若不加上 -y,則會顯示 comments? 做為提示符號。



--------------------------------------
get [options] files

SCCS 檔案取出成為文字檔。取出的檔案(稱為 g-file)和 SCCS 有一樣的檔名,但前面不加上 "s."。每個 SCCS 檔案,get 都會印出它的版本號碼和行數。請見前面 " 識別關鍵字 "一節說明檔案中可放入那些關鍵字。

Options

-an              取出 sequence 號碼為 n delta。不常用(多被 comb 使用)。
-b              建立新的 brance(和 -e 一起用)。
-cdate              只取出包括 date 日期之前修改過的版本。date 的格式為
YY[MM][DD][HH][MM][SS]。可用非數字符號來分隔這些欄位。
-e              取出檔案供編輯用;這是最常用的選項。
-g              不取出內文,只取出其版本號碼,常 用於檢查檔案用。
-Gname
              將取出的文字放入 name 這個檔案中。(預設為不加 "s.")(僅可用於 Solaris 2.0
-ilist              list 所指定的版本號碼的內容也併入所取出的檔案中。用 "-" 來指 定範圍。如 1.22.3-2.5
-k              不把 ID 關鍵字展開為值 ; -e 合用可以重建在編輯過程中損毀的檔案。
-l[p]              建立 delta 的大綱(存檔或是用 -lp 顯示在標準輸出上)
-m              將每一行前加上該行所對應的 SCCS ID
-n              將每一行前加上 %M% 關鍵字。(通常是文字檔名)。
-p              將取出的文字不寫入檔案,而寫入標 準輸出。
-rsid              取出 SCCS ID sid
-s              只輸出錯誤訊息。
-t              取出 release 中最新的版本。
-wstring             
              %W% 關鍵字以 string 代替。%W% what 的檔頭標籤。
-xlist              -i 相反,將 list 中所指定的 delta 排除在取出的檔案外。

範例:

prog.c 取出編輯;接下來的 delta 指令會在 1.3 的地方建立一個新的 branch

  get -e -b -r1.3 s.prog.c

prog.c 取出,但不取出任何在 1990 年六月 1 2:30p.m. 之後所做的任何修改。(但依然包括 2.6 2.7,這兩個版本有用 -i 指定包括在內):

              get -c'90/06/01 14:30:00' -i'2.6,2.7' s.prog.c

印出 s.text.c 的內容(除了 1.1-1.7 以外的所有版本)

              get -p -x1.1-1.7 s.text.c


--------------------------------------
help [commands | error_codes]

這是用來對 SCCS 的指令或是錯誤訊息做解釋的指令。不加任何參數時,help 會提示使用者輸入指令名稱或是錯誤代碼。若要指 令講解,就打入指令名稱,若需要錯誤訊息說明,則打入錯誤訊息後的代碼。help 的檔案通常放在 /usr/ccs/lib 中。

中斷 SCCS 所產生的錯誤訊息的形式如下:

ERROR filename: message code

code 可用來查詢所產生的錯誤為何。只要打:

help code

即可。

範例:
若完全不能動時,可試著用:

help stuck


--------------------------------------
prs [options] files

依格式將一個或多個檔案的資訊印出。

Options

-a              包括移除了的 delta 之資料。
-cdate              -e -l 所使用的日期去掉。(見 get 中日期格式說明)。
-d[format]              用文字或 SCCS 關鍵字指定印出的格式。見資料關鍵字的說明。
-e              -r 合用。列出 sid(含)之前的 delta 的資訊。和 -c 合用時,列出 date(含)之前的 delta 的資訊。
-l              -e 一樣,但列出 date 之後或是 sid(含)之後的 delta
-r[sid]              指定 SCCSID sid。預設為最新版本的 sid

範例:

下列指令:

              prs -d"program :M: version :I: by :P:" -r s.yes.c

其結果可能如下:

              program yes.c version 2.4.6 by daniel




--------------------------------------
rmdel-rsid files

從一個或多個 SCCS 檔中移除 deltasid SCCS ID。這個 delta 必需是該 branch 的最新版。



--------------------------------------
sact files

對指定的 SCCS files 檔,回報哪些 delta 將要更動(比如正在用 get -e 取出,但尚未用 delta 重新放入)。sact 輸出有五欄。目前編輯中的 delta SCCS ID,下一個要新建立的 deltaSCCS ID,執行 get -e 的使用者名稱及執行的時間。


--------------------------------------
sccsdiff-rsid1 -rsid2 [options] files
印出兩個不同的版本間的差異。sid1 sid2 指定兩個拿來做比較的 delta 版號。這個指令會執行 bdiff (然後呼叫 diff)。

Options

-p              將輸出導向到 pr
-sn              使用檔案節區大小為 nn 之值會傳給 bdiff)。


--------------------------------------
unget [options] files

將一個或多個 files 檔案的 get -e 動作取消。若有個檔案正在編輯中,用 delta 指令會建立新的 delta,而用 unget 時則會將所修改的部分予以取消,如此就不會建立 新的 delta

Options

-n              不將 get -e 所取出的檔案刪除。
-rsid              要取消的 SCCS ID。僅在同一個檔案執行過多個 get -e 時要使用。
-s              不將要處理的檔案的 sid 顯示出來。


--------------------------------------
val [options] files
確認 files 檔案符合在選項中所指定的條件。val 會將訊息顯示在標準輸出上,並在結束時傳回一個 8bit 的 值。

Options

-              從標準輸入讀入資料,並將每一行視為 val 的指令行參數。以 EOF 結束,這個選項為指令本身所使用。
-mname
              name 和檔案內的 %M% 相比較。
-rsid              檢查 sid 是否正確或是模稜兩可。
-s              不顯示任何錯誤訊息。
-ytype              type 和檔案內的 %Y% 相比較。


--------------------------------------
what [options] files

files 檔案內尋找 @(#) 然後印出之後的文字。其實這個指令尋找的是 %Z% 這個關鍵字,但因為 get 會把這個關鍵字換成 @(#)what 的主要功能是印出識別字串。

Options

-s              找到第一個符合的字串就跳出。

------------------------------------------


sccs 和擬指令(pseudo-command

這整個套裝軟體中還包括了 sccs 這個前端處理程式。這個指令提供了一個相當便利 的使用者介面。其語法如下:

/usr/ucb/sccs [options] command [SCCS_flags] [files]

除了一般的 SCCS 指令外,sccs 還提供了擬指令。這些擬指令是原本 SCCS 指令的一些常用的形式。options  僅可用於 sccs 介面。 command  SCCS  指令或是擬指令名稱。而 flags旗標則會傳給 SCCS 指令使用。

sccs 可讓指定檔案變得比較直接簡單,因為它會直接將 SCCS/.s 接在檔名之前。比如:

sccs get -e file.c

就會被解譯成:
get -e SCCS/s.file.c

Options

-dprepath              prepath 中找檔案,而不從目前目錄尋找。比如:
              sccs -d/home get file.c
              會被解譯成:
              get /home/SCCS/s.file.c
-pendpath              endpath 中存取檔案,而不從 SCCS 目錄中存取檔案。比如:
              sccs -pVERSIONS get file.c
              會被解譯成:
              get VERSIONS/s.file.c
-r              以真實使用者執行 sccs,而非有效使用者。

擬指令

相對應的 SCCS 指令列於括號中。

check              info,但傳回值為非零之值,而不是檔名。
clean              將目前目錄下不是 SCCS 正在編輯的檔案刪除。(如 get -e
create              建立 SCCS 檔案(admin -i 後執行 get
deledit              執行 delta 後執行 get -e
delget                            執行 delta 後執行 get
diffs              將目前的檔案和 SCCS 的版本做比較(和 sccsdiff 一樣)。
edit              取出檔案並編輯(get -e)。
enter              create 一樣,但後面不執行 getadmin -i)。
fix              rmdel 一樣(必須加上 -r)。
info              列出編輯中的檔案(sact)。
print              印出資訊(如 prs -e  後加上 get -p -m)。
tell              info 一樣,但一行只列出一個檔名。
unedit              unget 一樣。

沒有留言:

張貼留言

推到 Twitter!
推到 Plurk!
推到 Facebook!