3.2 從 RCS 轉換到 CVS 系統 要轉換已經存在的 RCS 檔案到 CVS ,請使用下面的 script 。並確定你從你的 Linux CD-ROM 安裝了 korn shell 套件 pdksh*.rpm。 注意 : Korn shell /bin/ksh 在你從Linux CD-ROM 安裝 pdksh*.rpm 時就會產生 _________________________________________________________________ #!/bin/ksh ############################################################# # Program to Migrate the existing source code in RCS to CVS # # Needs the korn shell RPM package pdksh*.rpm from Linux # contrib cdrom ############################################################# # # rcs2cvs - convert source tree from RCS to CVS # # project to convert PROJECT='project' # current RCS root RCSROOT="$HOME/rcs" if cd "$RCSROOT/$PROJECT" then cd "$RCSROOT" else echo >&2 "`basename "$0"`: can't change to RCS Directory '$RCSROOT/$PRO JECT'." exit 1 fi # current CVS root CVSROOT="$HOME/cvs" # create new CVS directory for project 'project' if mkdir "$CVSROOT/$PROJECT" then : else echo >&2 "`basename "$0"`: can't create CVS directory '$CVSROOT/$PROJEC T'." exit 2 fi # create CVS project tree from RCS tree find "$PROJECT" -type d -name RCS -print while read RCS do CVS="`dirname "$RCS"`" (if cd "$RCS" then # if find . -type f -name '*,v' -print cpio -pdmv "$CVSROOT/$CV S" if find . -type f -print cpio -pdmv "$CVSROOT/$CVS" then : else echo >&2 "`basename "$0"`: can't convert RCS subdirecto ry '$RCSROOT/$RCS' to CVS subdirectory '$CVSROOT/$CVS'." fi else echo >&2 "`basename "$0"`: can't change to RCS subdirectory '$R CSROOT/$RCS'." fi) done _________________________________________________________________ 現在 RCS 已經被改成 CVS 系統下的 'project'. 你可以開始用CVS命令來存取 'project' 這個模組了. 4. Shell Scripts 下面的 scripts 是基本 CVS 命令的集合,而且是 Korn shell 的 scripts 。你 可以把他轉成 perl 或者 bash。你可以自己修改成你想要的樣子。 這些只是運 用基本 CVS 命令但有些特殊的花樣加在裡面。例如, sedit 這個 script 提供了檔案鎖住的功能使得其他人知道有某人正在修改這個檔案, 當然你也可以直接 使用 CVS 命令而不用這些 scripts ,這些 scripts 只是在展示 CVS 是多麽的 有彈性。 把這些 scripts 復制到 /usr/local/bin 下,並且此目錄應該在你的 PATH 環境 變數中。 1. sget [-r revision_number] 要從 CVS 獲得一個唯 讀檔案或整個唯讀目錄, 請按 [9]sget 2. sedit [-r revision_number] 要修改一個一個程式碼時,這個 scripts 會做檔案鎖住的動作,因此沒有別人可以登出這個檔案了。當然你 可以改變這個 script 成你想要的功能 - 例如不鎖住,只出現警告訊息,或 者相反的,非常嚴謹的鎖檔案。 請按 [10]sedit 3. scommit [-r revision_number] 要交出某個你修改的檔案或整 個目錄。 把你的改變交給 CVS。 請按 [11]scommit 4. supdate 要藉由從 CVS 得到最新的檔案來update 一 個檔案或整個目錄。 請按 [12]supdate 5. sunlock [-r revision_number] 要把因為用 sedit 後的檔案鎖 關掉。這會釋放檔案鎖(Release File Lock)。 請按 [13]sunlock 6. slist 要看目前正被你修改的檔案列表。 做 'ls -l grep ...' 命令, 請按 [14]slist 7. sinfo 要得到一個檔案的改版資訊。 請按 [15]sinfo 8. slog 要得到一個 CVS 檔案改版的歷史紀錄, 請按 [16]slog 9. sdif sdif -r rev1 -r rev2 要得到你的檔案與 CVS 櫃子裡的檔案不 同的地方在哪裡。 請按 [17]sdif 注意: sdif 只有一個 'f' ,因為這裡已經有一個 unix 命令叫 'sdiff'。 10. sadd 要新增一個檔案到 CVS 櫃子裡。 請按 [18]sadd 11. sdelete 要從 CVS 櫃子裡清掉一個檔案。 請按 [19]sdelete 12. sfreeze 要凍結原始碼 (freeze codes) ,這是將要發行 (release) 整個原始碼目錄樹。 請按 [20]sfreeze 13. saddtree 要新增一個目錄樹到 CVS 。 請按 [21]saddtree 例如 : _____________________________________________________________ cd $HOME; sfreeze REVISION_1_0 srctree _____________________________________________________________ 這將會凍結原始碼,並貼上一個標簽 REVISION_1_0 ,如此一來你就可以稍 後用版本名字登出整個目錄樹。 ****************************************************** 4.1 sget 注意 : Korn shell /bin/ksh 在你從Linux CD-ROM 安裝 pdksh*.rpm 時就會產 生 請把他存成一般文字檔並改變存取權限 chmod a+rx _________________________________________________________________ #!/bin/ksh # CVS program sget # Program to check out the file from CVS read-only cmdname=`basename $0` Usage() { print "\nUsage: $cmdname [-r revision_number/symbolic_tag_name] irectory name> " print "The options -r are optional " print "For example - " print " $cmdname -r 1.1 foo.cpp" print " $cmdname foo.cpp " print " $cmdname some_directory " print "Extract by symbolic revision tag like - " print " $cmdname -r REVISION_1 some_directory " print " " exit } # Command getopt will not supported in next major release. # Use getopts instead. while getopts r: ii do case $ii in r) FLAG1=$ii; OARG1="$OPTARG";; ?) Usage; exit 2;; esac done shift ` eXPr $OPTIND - 1 ` #echo FLAG1 = $FLAG1 , OARG1 = $OARG1 if [ $# -lt 1 ]; then Usage fi bkextn=sget_bak hme=` echo $HOME cut -f1 -d' ' ` if [ "$hme" = "" ]; then print "\nError: \$HOME is not set!!\n" exit fi # Check if file already exists.... if [ -f $1 ]; then user_perms=" " group_perms=" " other_perms=" " user_perms=`ls -l $1 awk '{print $1 }' cut -b3-3 ` group_perms=`ls -l $1 awk '{print $1 }' cut -b6-6 ` other_perms=`ls -l $1 awk '{print $1 }' cut -b9-9 ` if [ "$user_perms" = "w" -o "$group_perms" = "w" \ -o "$other_perms" = "w" ]; then print "\nError: The file is writable. Aborting $cmdname ......" print " You should either backup, scommit or delete the f ile and" print " try $cmdname again\n" exit fi fi cur_dir=`pwd` #echo $cur_dir len=${#hme} len=$(($len + 2)) #echo $len subdir=` echo $cur_dir cut -b $len-2000 ` #echo $subdir if [ "$subdir" = "" ]; then fdname=$1 else fdname=$subdir"/"$1 fi # Move the file toUCh $1 2>/dev/null \mv -f $1 $1.$bkextn # Create subshell ( cd $hme #echo $fdname # Use -A option to clear all sticky flags if [ "$FLAG1" = "" ]; then cvs -r checkout -A $fdname else cvs -r checkout -A -$FLAG1 $OARG1 $fdname fi ) #pwd if [ -f $1 ]; then print "\nREAD-ONLY copy of the file $fdname oBTained." print "Done $cmdname" #print "\nTip (Usage): $cmdname \n" fi