CVS 入門

tonywi888發表於2007-04-24

入門第一步:設環境、初始化

首先,在~/.cshrc 中加入

setenv CVSROOT $HOME/cvsroot

然後進行初始化:

source ~/.cshrc
cvs init

執行完之後,在 $HOME 下就會出現一個 cvsroot 目錄,其中有一個 CVSROOT 目錄,該目錄中有一大堆檔案,要想知道每個檔案具體是幹什麼的就只有慢慢學了!

程式匯入(import)

假定我們要維護的程式在目錄 myproj 下,在匯入前,首先將 mypoj 下所有的垃圾檔案(包括目標檔案、備份檔案以及可執行檔案,等等)刪除掉。然後執行下列命令:

cvs import -m "initial version" myproj  jrandom  start

該命令將程式匯入到($CVSROOT)中,如果要導到另一倉庫,可以指定路徑

cvs -d [倉庫路徑]  import

匯出工作複製(checkout)

當 myproj 被匯入 CVS 中以後,就不應再在原檔案上進行修改了,因為原來的檔案並不在版本控制序列之中。正確的做法是在一個“工作複製”(working copy)上進行修改,故應執行如下命令:

mv myproj myproj-old    (或 rm -r -f myproj)
cvs checkout myproj

這樣就得到了一個工作複製,它與原目錄的結構和內容幾乎完全相同,只是在每一個子目錄下多了一個CVS目錄。

版本同步(update)

該命令的形式為:

cvs update

其作用是使工作複製的版本與倉庫中的最新版本同步,將別人的修改以補丁(patch)的形式合併進自己的複製中,其作用主要體現於協同開發。此外,更新時可能出現衝突,此時就需要兩個人進行協商解決。

倉庫版本升級(commit)

命令格式為:

cvs commit -m "change message" [filename]

其中“-m”選項是必須的,如果沒有加的話,系統會自動開啟一個編輯器讓你輸入修改資訊。

顯示資訊常用命令

常用的有:

cvs diff -c     (比較當前工作複製與最高版本的區別)
cvs status      (顯示當前工作複製的狀態)
cvs log         (檢視修改歷史)

回到前面的版本(從 1.4 回到 1.2)

1. 慢速方法

(1). 檢視當前最高版本檔案的內容
     cvs -Q update -p [filename]
(2). 檢視1.2是否是所需版本
     cvs -Q update -p -r 1.2 [filename]
(3). 若已確認, 則
     cvs -Q update -p -r 1.2 [filename] > [filename]
(4). 更新倉庫
	 cvs commit -m "reverted to 1.2 code" [filename]

這樣就產生了版本1.5,但其內容與1.2完全相同。這也就是說,版本號是在不斷升高的,但其內容可以回到過去。

2. 快速方法

cvs update -j 1.4 -j 1.2 [filename]

注:這裡介紹的兩種方法都是處理單個檔案的,對於多個檔案的處理稍後再補上。

新增檔案

分兩步

cvs add [newfiles]
cvs commit -m "add newfiles" [newfiles]

刪除檔案

分三步

rm [filenames]    (刪除工作複製中的檔案)
cvs remove [filenames]
cvs commit -m "remone files" [filenames]

新增目錄

只需一步,無需“commit”

mkdir subdir    (該命令不算一步)
cvs add subdir

刪除目錄

1. 首先要刪除目錄中所有的檔案

cd subdir
rm file1 file2 ...
cvs remove file1 file2 ...
cvs commit -m "rm all files in subdir" file1 file2 ...

2. 然後再在上一級目錄執行

cvs update -P

該命令是刪除當前目錄下所有的空目錄。實際上,空目錄只是從工作複製中消失,而倉庫中還有一個空目錄。

檔案重新命名

其基本思想是:刪除舊檔案,新增新檔案。具體過程為:

mv oldname newname
cvs remove oldname
cvs add newname
cvs commit -m "mv oldname newname" oldname newname

目錄重新命名

其基本思想是:建一個新目錄,將舊目錄中的檔案移到新目錄中,再分別在新舊目錄中進行新增和刪除操作,最後是刪除空目錄。具體過程為:

mkdir newdir
cvs add newdir
mv olddir/* newdir
cd olddir
cvs rm file1  file2 ...
cd ../newdir
cvs add file1 file2 ...
cd ..
cvs commit -m "rename dir"
cvs update -P

CVS 配置檔案

有時我們經常用到一些選項,每次都輸入比較麻煩,解決的辦法是在家目錄下建立一個配置檔案:.cvsrc,其內容如下:

diff -c
update -P

建立了此檔案之後

cvs diff   就相當於  cvs diff -c

此處,“ diff ”若簡寫為“ di ”則配置檔案中的繫結無效。

命令簡寫

CVS的命令都比較長,所以它提供了簡寫方式。只要在 shell 命令列中輸入:

cvs --help-synonyms

就可以得到如下命令簡寫列表:

CVS command synonyms are:
        add          ad new
        admin        adm rcs
        annotate     ann
        checkout     co get
        commit       ci com
        diff         di dif
        export       exp ex
        history      hi his
        import       im imp
        log          lo
        login        logon lgn
        rannotate    rann ra
        rdiff        patch pa
        release      re rel
        remove       rm delete
        rlog         rl
        rtag         rt rfreeze
        status       st stat
        tag          ta freeze
        update       up upd
        version      ve ver

幾個常用 Shell 命令

由上面的介紹可知,在 CVS 中增減檔案或目錄是一件麻煩事,為了簡化該過程,我(姓王名亮)特意寫了如下幾個常用 Shell 命令以惠世人,敬請積極試用,發現問題請及時告知。但事先宣告的是:由於用本命令所造成的損失,鄙人概不負責!:-)

1. /usr/local/bin/cvs-add

命令格式: cvs-add [file list] [directory list]
    功能: 在 CVS 新增目錄和檔案

其原始碼如下:

#!/bin/tcsh -f

#add files or diretories in CVS

set ffdd=`echo $*`

foreach fd ($ffdd)
  if(-d $fd) then
# rm the diretories in directory $fd
    set CVSdir=`find $fd -type d -name "CVS"`
    rm -r -f $CVSdir
# find the files and directories in directory $fd
    set ff=`find $fd -type f`
    set dd=`find $fd -type d`
# add directories
    cvs add $dd
# add files
    cvs add $ff
    cvs commit -m "add files in directory '$fd'"
  else
    cvs add $fd
    cvs commit -m "add file '$fd'" $fd
  endif
end

2. /usr/local/bin/cvs-rm

命令格式: cvs-rm [file list] [directory list]
    功能: 在 CVS 刪除目錄和檔案(同時刪除倉庫和工作複製中的目錄和檔案)

其原始碼如下:

#!/bin/tcsh -f

#remove files or diretories in CVS

set ffdd=`echo $*`

echo "你真的要刪除 $* 嗎?(y/n)"
set flag = $<
if($flag == 'y') then
  echo "你真的不後悔嗎?(y/n)"
  set flag2 = $<
  if($flag2 == 'y') then
    foreach fd ($ffdd)
      if(-d $fd) then
        echo "rm $fd from CVS"
# find the files and directories in directory $fd  
        set ff=`find $fd -type f`
# find the files in $fd (not include the files in CVS)
        foreach f ($ff)
          echo $f >>ffftmp
        end
        set fff=`cat ffftmp | sed -e '/CVS/d'`
        rm  ffftmp  -f
# remove the file from CVS permanently     
        if ($%fff > 0) then
          rm $fff -f
          cvs remove $fff
          cvs commit -m "rm files in directory '$fd'" $fff
        endif
# rm directories
        set Root=`cat $fd/CVS/Root `
        set Repository=`cat $fd/CVS/Repository`
        rm -r -f $fd
        echo "rm $Root/$Repository"
        rm -r -f $Root/$Repository
      else
        rm -f $fd
        cvs remove $fd
        cvs commit -m "rm file '$fd'" $fd
      endif
    end
    echo "唉!你現在後悔也晚了!:-) "
  endif
endif

3. /usr/local/bin/cvs-rmCVS

命令格式: cvs-rmCVS [directory list]
    功能: 刪除指定目錄及其子目錄中的 CVS 目錄。

其原始碼如下:

#!/bin/tcsh -f

set ffdd=`echo $*`

foreach fd ($ffdd)
  if(-d $fd) then
# rm the diretories CVS in directory $fd
    set CVSdir=`find $fd -type d -name "CVS"`
    rm -r -f $CVSdir
  endif
end
[@more@]

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/8570952/viewspace-912153/,如需轉載,請註明出處,否則將追究法律責任。

相關文章