您的位置:軟件測(cè)試 > 開源軟件測(cè)試 > 開源配置管理工具 > cvs
使用CVS進(jìn)行項(xiàng)目開發(fā)管理
作者:網(wǎng)絡(luò)轉(zhuǎn)載 發(fā)布時(shí)間:[ 2013/2/17 16:40:52 ] 推薦標(biāo)簽:

  在多人共同開發(fā)一個(gè)大型項(xiàng)目時(shí),源代碼的維護(hù)和版本維護(hù)是一件令人頭疼的事情,由于多人開發(fā),每個(gè)開發(fā)人員都擁有此項(xiàng)目的副本,所以如果要手動(dòng)維護(hù)同一個(gè)文件多人的修改是十分困難的事情。
  另外,可能你需要的項(xiàng)目的版本不是當(dāng)前開發(fā)的新的版本, 如果為了這個(gè)目的而為每一個(gè)版本保留一個(gè)備份幾乎是不可能的。Linux平臺(tái)上提供了一個(gè)功能軟件:CVS。眾所周知,Linux的發(fā)展得益于互聯(lián)網(wǎng)的發(fā)展,大部分的軟件都是眾多開發(fā)者在互聯(lián)網(wǎng)上共同開發(fā)的,這些軟件的維護(hù)大部分都使用CVS,例如Deban Linux的開發(fā)、KDE的開發(fā),以及sourceforg上的開發(fā)項(xiàng)目。正確熟練使用CVS是一個(gè)Linux程序員基本的素質(zhì)。
  
  CVS不僅可以維護(hù)源代碼,事實(shí)上,所有的文本文件都可以使用CVS來(lái)管理,當(dāng)然也可以管理 二進(jìn)制文件,只是需要特殊的命令選項(xiàng)罷了。
  
  CVS把文件保存在一個(gè)名叫倉(cāng)庫(kù)(repository)的地方,倉(cāng)庫(kù)中保存的文件并不是每個(gè)版本的副本,而是可以從任意版本回溯到初始版本的一些代碼的主控信息,這樣,節(jié)省了大量的存儲(chǔ)空間。
  倉(cāng)庫(kù)不僅可以建立在本機(jī)上,也可以建立在網(wǎng)絡(luò)上。另外CVS支持版本分支(tag),這樣可以從任意的版本中衍生出另外一個(gè)版本進(jìn)行開發(fā),必要時(shí),還可以把這個(gè)分支合并到主開發(fā)分支去。
  
  CVS需要一個(gè)名叫RCS(修訂控制系統(tǒng))的軟件,確切說(shuō),CVS主要管理開發(fā)項(xiàng)目中的目錄的改動(dòng),而RCS則側(cè)重于管理的一個(gè)文件的改變。如果要使用網(wǎng)絡(luò)的CVS,還需要rsh或者自己內(nèi)置的cvs-server,rsh是CVS客戶于服務(wù)器的通信平臺(tái),如果需要安全的信息傳輸,可以使用ssh,這個(gè)可以使用CVS_RSH環(huán)境變量來(lái)指定:
  export CVS_RSH=rsh 使用rsh
  export CVS_RSH=ssh 使用ssh
  
  RCS使用
  在使用CVS之前,先介紹一下RCS的使用方法。
  正如前面所說(shuō),RCS是針對(duì)某一個(gè)特定的文件進(jìn)行管理,常用到的命令是co和ci。RCS使用當(dāng) 前工作路徑下的RCS目錄來(lái)存儲(chǔ)管理的文件。
  ci (check in)把源代碼加入到RCS源代碼倉(cāng)庫(kù)中,每一個(gè)添加進(jìn)代碼庫(kù)中的文件的版本是 1.1。
  以后每次修改文件重新ci以后,此文件的版本遞增為1.2 ,1.3.……。
  co(check out)把源文件從RCS源代碼倉(cāng)庫(kù)中取出,缺省的版本是新的版本,如果你需要一個(gè)指定的版本,則需要使用-r選項(xiàng)指定。例如:
  $mkdir RCS 建立RCS源代碼倉(cāng)庫(kù)
  編輯一個(gè)文件,如hello.c
  #include <stdio.h>
  int main (void)
  {
  printf ("Hello World ");
  return 0;
  }
  然后把它加入到RCS倉(cāng)庫(kù)中:
  [kerberos@power zhyf]$ ci hello.c
  RCS/hello.c,v <-- hello.c
  enter description, terminated with single '.' or end of file:
  NOTE: This is NOT the log message!
  >>the inital verion. 輸入關(guān)于文件改動(dòng)的信息
  >> . 以.結(jié)束信息輸入
  initial revision: 1.1 初始版本是1.1
  done
  [kerberos@power zhyf]$
  當(dāng)文件加入到源代碼倉(cāng)庫(kù)后,RCS會(huì)自動(dòng)刪除文件。
  
  如果需要修改文件,則從倉(cāng)庫(kù)取出:
  [kerberos@power zhyf]$ co hello.c
  RCS/hello.c,v --> hello.c
  revision 1.1
  done
  此時(shí),取出的文件是只讀的,如果需要編輯文件,需要對(duì)文件加鎖取出,防止與他人編輯沖突!
  加鎖取出使用-l (lock)選項(xiàng)。
  [kerberos@power zhyf]$ co -l hello.c
  RCS/hello.c,v --> hello.c 從RCS倉(cāng)庫(kù)中取出hello.c,倉(cāng)庫(kù)中的文件是以v結(jié)尾的。
  revision 1.1 (locked) 指明是加鎖取出
  done
  這時(shí),我們可以修改和編輯文件了。
  例如:
  #include <stdio.h>
  int main (void)
  {
  printf ("Hello World ");
  printf("checkoutwithlock "); 添入代碼
  return 0;
  }
  [kerberos@power zhyf]$ ci hello.c
  RCS/hello.c,v <-- hello.c
  new revision: 1.2; previous revision: 1.1 重新加入到倉(cāng)庫(kù),文件版本遞增為1.2
  enter log message, terminated with single '.' or end of file:
  >> check out with lock and modified it .
  >> .
  done
  如果你需要先前的hello.c,也是1.1版本的,可以使用-r來(lái)指定取出文件的版本:
  [kerberos@power zhyf]$ co -l -r1.1 hello.c
  hello.c,v --> hello.c
  revision 1.1 (locked) 取出1.1版本
  done
  可以嘗試使用兩次加鎖取出,這時(shí)候,RCS會(huì)提示警告信息。
  [kerberos@power zhyf]$ co -l hello.c
  hello.c,v --> hello.c
  revision 1.1 (locked)
  writable hello.c exists; remove it? [ny](n) 是否覆蓋當(dāng)前的hello.c
  如果回答n,則取出失敗,回答是則覆蓋當(dāng)前文件與-l相反的選項(xiàng)是-u,取出不加鎖的文件用于工作。-f則在ci時(shí)強(qiáng)制覆蓋RCS倉(cāng)庫(kù)中的文件,在co時(shí)強(qiáng)制覆蓋當(dāng)前的文件。 
  
  在RCS中,支持類似于宏的關(guān)鍵字,在ci后,這些關(guān)鍵字會(huì)被RCS替換成特定的信息,如$Id$關(guān)鍵字:
  /*$Id
  */
  #include <stdio.h>
  int main (void)
  {
  printf ("Hello World ");
  printf("checkoutwithlock ");
  return 0;
  }
  ci 之后,然后取出,文件將變成:
  /*$Id: hello.c,v 1.3 2001/02/22 16:16:58 kerberos Exp kerberos $
  */
  #include <stdio.h>
  int main (void)
  {
  printf ("Hello World ");
  printf ("check out with lock ");
  return 0;
  }
  $Id$ 關(guān)鍵字是用文件名、版本、時(shí)間、作者 及代碼性質(zhì)替換,如果使用-l選項(xiàng)取出,在Exp后面會(huì)加上登錄用戶的名稱。除了$Id$關(guān)鍵字,RCS還支持下面常用的關(guān)鍵字:
  $Log$ : 你所提供的修改日志信息。
  $Author$ :存入該版本的作者。
  $Locker$ : 該版本的加鎖者
  $State$ : 該版本的狀態(tài) Exp(試驗(yàn)版), Stabe(穩(wěn)定版), Rel(發(fā)行版).缺省是Exp
  $Date$ : 該版本存入的時(shí)間,使用UTC時(shí)間格式。
  $Revision$ : 該版本的版本號(hào)
  $RCSfile$ : RCS文件名
  $Source$ : RCS全路徑名
  $Name$ : 取回該版本的符號(hào)名
  $Header$ : 相當(dāng)于$ Source $$ Revision$$Date$$Author $$State$$Locker$的組合在UNIX/Linux下有一個(gè)diff工具可以比較兩個(gè)文件的不同,rcsdiff可以在不同的版本之間比較文件的不同,而不必取出文件,如:
  rcsdiff hello.c 比較當(dāng)前hello.c文件與RCS倉(cāng)庫(kù)中新版本的區(qū)別。
  rcsdiff -r1.1 hello.c 比較當(dāng)前hello.c文件與hello.c的1.1版本的區(qū)別。
  rcsdiff -r1.2 -r1.1 比較hello.c 文件的1.1版本和1.2版本的區(qū)別。
  使用這個(gè)命令,可以很方便的做出任意版本之間的補(bǔ)丁文件。
  另外,還有其他一些不常用的RCS命令,讀者可以參考更詳細(xì)的資料。

上一頁(yè)123下一頁(yè)
軟件測(cè)試工具 | 聯(lián)系我們 | 投訴建議 | 誠(chéng)聘英才 | 申請(qǐng)使用列表 | 網(wǎng)站地圖
滬ICP備07036474 2003-2017 版權(quán)所有 上海澤眾軟件科技有限公司 Shanghai ZeZhong Software Co.,Ltd