CVS 入門教程(linux下配置)

來源:互聯網
上載者:User
CVS 入門教程From PostgreSQL 中文維基, PostgreSQL 中文站, PostgreSQL 中國社區, PostgreSQL Chinese communityJump to: navigation, search

[編輯] CVS 簡單教程
目錄

[隱藏]

  • 1 CVS 簡單教程

    • 1.1 前言
    • 1.2 步驟和做法
      • 1.2.1 前提要求
      • 1.2.2 架設CVS伺服器
      • 1.2.3 設定用戶端
      • 1.2.4 管理 cvs 伺服器
      • 1.2.5 命令介紹
    • 1.3 一些小技巧

版本:v2.1

著作權聲明:本文檔遵循 FDL 著作權發布,有關 FDL 的詳細資料,請參考:

http://www.fsf.org/copyleft/fdl.html

作者:何偉平

[編輯] 前言

CVS 是 Concurrent Version System(並行版本系統)的縮寫,用於版本管理.如果大家曾經參與過多人協作開發的項目,大家肯定有這樣的痛苦經曆:由於多個人同時修改同一個檔案,自己辛辛苦苦修改的程式被別人徹底刪除了.另外,如果你的軟體/程式已經發布了三個版本,而這時候使用者需要你修改第二個版本的東西,也許你會因為只保留了最新版本而痛哭流涕.還有就是你對程式做了一些修改,但是修改很少,你只想給遠方的同事發一個兩個版本之間的差別檔案,這樣可以免於郵箱不夠大,網速太慢之類的問題.為瞭解決類似這樣的問題,以及諸如產生補丁檔案,曆史版本修改等,一幫駭客(褒義)在原先 Unix 體系裡很成熟的 SCCS 和 RCS 的基礎上,開發了 CVS.(SCCS:Source Code Control System,RCS:Revision Control System)

CVS 的基本工作思路是這樣的:在一台伺服器上建立一個倉庫,倉庫裡可以存放許多不同項目的來源程式.由倉庫管理員統一管理這些來源程式.這樣,就好象只有一個人在修改檔案一樣.避免了衝突.每個使用者在使用倉庫之前,首先要把倉庫裡的專案檔下載到本地.使用者做的任何修改首先都是在本地進行,然後用 cvs 命令進行提交,由 cvs 倉庫管理員統一修改.這樣就可以做到追蹤檔案變化,衝突控制等等.

由於 CVS 是典型的 C/S 結構的軟體,因此它也分成伺服器端和用戶端兩部分.不過大多數 CVS 軟體都把它們合二為一了.

結合文檔和一些網上資源,我寫一點非常簡單的“速成”的教材.希望對大家有用.

[編輯] 步驟和做法

[編輯] 前提要求
  1. root 許可權;
  2. CVS軟體,請找到相關的rpm,tgz,deb 等封裝上,或者到 http://www.cvshome.org/CVS/Dev/code 下載原程式編譯安裝,這裡我不準備介紹它的安裝,請參考CVS自身的文檔安裝.我使用Slackware的tgz包,安裝的命令是
     #installpkg cvs*.tgz 

    。其他包請參考對應包管理工具的命令.

  3. 一定的系統資源,要有一定記憶體(32M就能工作得很好),要一定的磁碟空間,看你的項目的大小和多少而定.

[編輯] 架設CVS伺服器
  • . 建立 CVSROOT 目錄,因為這裡涉及到使用者對CVSROOT裡的檔案讀寫的許可權問題,所以比較簡單的方法是建立一個組,然後再建立一個屬於該組的帳戶,而且以後有讀寫權限的使用者都要屬於該組.假設我們建一個組叫cvs,使用者名稱是cvsroot.建組和使用者的命令如下:
#groupadd cvsadduser cvsroot
產生的使用者家目錄在/home/cvsroot(根據自己的系統調整)
  • . 用 cvsroot 使用者登陸,修改 /home/cvsroot (CVSROOT)的許可權,賦與同組人有讀寫的許可權:
          $chmod 771 . (或者770應該也可以)
注意:這一部分工作是按照文檔說明做的,是否一定需要這樣沒有實驗,我會在做實驗後在以後版本的教程說得仔細一點.如果您有這方面的經驗請提供給我,謝謝.
  • . 建立CVS倉庫,(仍然是 cvsroot 使用者),用下面命令:
    $cvs    -d /home/cvsroot init 
  • . 以root身份登陸,修改 /etc/inetd.conf(使用 xinetd 的系統沒有此檔案)和 /etc/services,如果用的是 inetd 的系統,在 /etc/inetd.conf 裡加入:
           cvsserver    stream    tcp    nowait    root    /usr/bin/cvs    cvs -f  --allow-root=/home/cvsroot pserver
說明:上面的行是單獨一整行,/usr/bin/cvs 應該是你的cvs版本的命令路徑,請根據自己的系統調整./home/cvsroot 是你建立的CVSROOT的路徑,也請根據上面建立目錄的部分的內容做調整.
如果是使用 xinetd 的系統,需要在 /etc/xinetd.d/ 目錄下建立檔案 cvspserver(此名字可以自己定義),內容如下:

           # default: on# description: The cvs server sessions;
           service cvsserver{socket_type = streamwait = nouser = rootserver = /usr/bin/cvsserver_args = -f --allow-root=/cvsroot pserverlog_on_failure += USERIDonly_from = 192.168.0.0/24}

其中only_from是用來限制訪問的,可以根據實際情況不要或者修改。修改該檔案許可權:

           # chmod 644 cvspserver
在/etc/services裡加入:

           cvsserver    2401/tcp
說明:cvsserver 是任意的名稱,但是不能和已有的服務重名,也要和上面修改 /etc/inetd.conf 那行的第一項一致.這裡我用的是 CVS 的口令認證方式,CVS 還有其他認證方式,我沒有做實驗,如果您有經驗,請補充,謝謝.
  • . 添加可以使用 CVS 服務的使用者到 cvs 組:
以 root 身份修改 /etc/group,把需要使用 CVS 的使用者名稱加到 cvs 組裡,比如我想讓使用者 laser 和gumpwu 能夠使用 CVS 服務,那麼修改以後的 /etc/group 應該有下面這樣一行:
           cvs:x:105:laser,gumpwu

在你的系統上GID可能不是105,沒有關係.主要是要把laser和gumpwu用逗號分隔開寫在最後一個冒號後面.當然,象RedHat等分發版有類似linuxconf這樣的工具的話,用工具做這件事會更簡單些.
  • . 重起inetd使修改生效:
     #killall -HUP inetd
如果使用的是 xinetd 的系統:

           # /etc/rc.d/init.d/xined restart

這樣伺服器就設定完成了.我們接著搞用戶端.

[編輯] 設定用戶端

如果是 Linux(或者其他 *nix),用戶端和伺服器端的軟體是一樣的,如果是Win,MAC等平台,請到

http://www.loria.fr/cgi-bin/molli/wilma.cgi/rel

找相應的用戶端軟體,這裡我先說一下在 Linux(*nix)裡怎麼做:

  • . 設定環境變數CVSROOT:
      $export CVSROOT=:pserver:laser@the_server_name:/home/cvsroot
注意:這裡的pserver是訪問方式,我在上面設定的是口令認證,所以這裡是pserver,如果你的CVS伺服器設定成別的訪問模式,那麼需要相應修改.laser是可以使用 CVS伺服器的使用者名稱,這裡可以根據你的設定修改,我在這個版本設定的是直接使用系統使用者的口令檔案,也就是說laser必須是CVS伺服器上的合法使用者,這裡當然有安全問題,CVS可以設定成為擁有自己的使用者,我將在以後的版本裡面增加這些內容,或者您也可以提供一些補充,或者直接讀CVS的文檔. the_server_name是CVS伺服器的名稱或者IP地址,根據你的情況填寫,/home/cvsroot是你的CVS伺服器的CVSROOT目錄,根據你的CVS伺服器設定做修改或者詢問管理員.你可以把這行放到你的shell的profile裡(.bash_profile,.profile 等)這樣就不用每次敲一長串命令了.
  • . 登陸CVS伺服器:
      $ cvs login,這時候 cvs 會問你口令,請把你在 CVS 伺服器上的口令敲進去,這裡是 laser 在 CVS伺服器上的系統使用者的口令:Passwd:xxxxxxxx

成功登陸後將在你的家目錄建立一個 .cvspass 檔案,以後就不用輸入口令了.

好,用戶端設定完成,簡單吧.

[編輯] 管理 cvs 伺服器

伺服器可以用了,現在大家最關心的就是如何管理伺服器,比如,我想讓一些人有讀和/或寫 CVS 倉庫的許可權,但是不想給它系統許可權怎麼辦呢?

不難,在 cvs 管理使用者(在我這裡是 cvsroot 使用者)的家目錄裡有一個 CVSROOT 目錄,這個目錄裡有三個設定檔,passwd, readers, writers,我們可以通過設定這三個檔案來配置 CVS 伺服器,下面分別介紹這幾個檔案的作用:

passwd:cvs 使用者的使用者列表檔案,它的格式很象 shadow 檔案:

  {cvs 使用者名稱}:[加密的口令]:[等效系統使用者名稱]

如果你希望一個使用者只是 cvs 使用者,而不是系統使用者,那麼你就要設定這個檔案,剛剛安裝完之後這個檔案可能不存在,你需要以 cvs 管理使用者手工建立,當然要按照上面格式,第二個欄位是該使用者的加密口令,就是用 crypt (3) 加密的,你可以自己寫一個程式來做加密,也可以用我介紹的偷懶的方法:先建立一個系統使用者,名字和 cvs 使用者一樣,口令就是準備給它的 cvs 使用者口令,建立完之後從 /etc/shadow 把該使用者第二個欄位拷貝過來,然後再把這個使用者刪除.這個方法對付數量少的使用者比較方便,人一多就不合適了,而且還有衝突條件(race condition)的安全隱患,還要 root 許可權,實在不怎麼樣.不過權益之計而已.寫一個小程式並不難,可以到 linuxforum 的編程版搜尋一下,有個朋友已經寫了一個貼在上面了.

第三個欄位就是等效系統使用者名稱,實際上就是賦與一個 cvs 使用者一個等效的系統使用者的許可權,看下面的例子你就明白它的功能了.

readers:有 cvs 讀許可權的使用者列表檔案.就是一個一維列表.在這個檔案中的使用者對 cvs只有讀許可權.

writers:有 cvs 寫入權限的使用者的列表檔案.和 readers 一樣,是一個一維列表.在這個檔案中的使用者對 cvs 有寫入權限.

上面三個檔案在預設安裝的時候可能都不存在,需要我們自己建立,好吧,現在還是讓我們用一個例子來教學吧.假設我們有下面幾個使用者需要使用 cvs:

laser, gumpwu, henry, betty, anonymous.

其中 laser 和 gumpwu 是系統使用者,而 henry, betty, anonymous 我們都不想給系統使用者權限,並且 betty 和 anonymous 都是唯讀使用者,而且 anonymous 更是連口令都沒有.那麼好,我們先做一些準備工作,先建立一個 cvspub 使用者,這個使用者的責任是代表所有非系統使用者的 cvs 使用者讀寫 cvs 倉庫.

  #adduser...

然後編輯 /etc/group,令 cvspub 使用者在 cvs 組裡,同時把其它有系統使用者權限的使用者加到 cvs 組裡.(見上文)

然後編輯 cvs 管理員家目錄裡 CVSROOT/passwd 檔案,加入下面幾行:

  laser:$xxefajfka;faffa33:cvspubgumpwu:$ajfaal;323r0ofeeanv:cvspubhenry:$fajkdpaieje:cvspubbetty:fjkal;ffjieinfn/:cvspubanonymous::cvspub

注意:上面的第二個欄位(分隔字元為 :)是密文口令,你要用程式或者用我的土辦法產生.

編輯 readers 檔案,加入下面幾行:

  anonymousbetty

編輯 writer 檔案,加入下面幾行:

  lasergumpwuhenry

這樣就 ok 了,你再用幾個使用者分別登陸測試,就會發現一切都 ok 了.這裡面的原理和說明我想就不多說了,其實很簡單,和系統管理使用者的概念是一樣的.

現在伺服器和用戶端都設定好了,那麼怎麼用呢,我在這裡寫一個最簡單的(估計也是最常用的)命令介紹:

[編輯] 命令介紹

首先,建立一個新的CVS項目,一般我們都已經有一些專案檔了,這樣我們可以用下面步驟產生一個新的CVS項目:

  • . 進入到你的已有項目的目錄,比如叫 cvstest:
           $cd  cvstest
  • . 運行命令:
           $cvs import -m "this is a cvstest project" cvstest     v_0_0_1     start
說明: import 是cvs的命令之一,表示向cvs倉庫輸入專案檔.-m參數後面的字串是描述文本,隨便寫些有意義的東西,如果不加 -m 參 數,那麼cvs會自動運行一個編輯器(一般是vi,但是可以通過修改環境變數EDITOR來改成你喜歡用的編輯器.)讓你輸入資訊, cvstest 是項目名稱(實際上是倉庫名,在CVS伺服器上會儲存在以這個名字命名的倉庫裡.) v_0_0_1是這個分支的總標記.沒啥用(或曰不常用.)start 是每次 import 標識檔案的輸入層次的標記,沒啥用.

這樣我們就建立了一個CVS倉庫了,然後,我們可以把這個測試專案的檔案刪除.實驗一下如何從倉庫擷取檔案.這裡我假設上面的所有用戶端工作你都已經做過了.運行下面的命令:

      $cvs checkout cvstest

從倉庫中檢索出cvstest項目的源檔案.如果你已經做過一次checkout了,那麼不需要重新checkout,只需要進入cvstest項目的目錄,更新一把就行了:

   $cd cvstest$cvs update

一下即可.又或者你不想直接更新,只是想看看有沒有更新的東西,那麼:

   $cvs status

這時後會列印出一長串狀態報表(你可能需要用類似less這樣的命令分頁顯示,或者定向到一個輸出檔案裡慢慢看.),對項目中的每個檔案有一份狀態報表,類似這樣:

===================================================================File: foo.c             Status: Up-to-dateWorking revision:    1.1.1.1 'Some Date'Repository revision: 1.2     /home/cvsroot/cvstest/foo.c,vSticky Tag:          (none)Sticky Date:         (none)Sticky Options:      (none)

這裡最重要的就是 Status 欄,這裡總共可能有四種狀態:

  1. Up-to-date:表明你要到的檔案是最新的.
  2. Locally Modified:表明你曾經修改過該檔案,但還沒有提交,你的版本比倉庫裡的新.
  3. Needing Patch:表明有個哥們已經修改過該檔案並且已經提交了!你的版本比倉庫裡的舊.
  4. Needs Merge:表明你曾經修改過該檔案,但是偏偏有個不識相的也修改了這個檔案,而且還提交給倉庫了!

如果你只是想保持軟體的同步的話(象我),那麼上面的東西就足夠用了.可是如果多人協作開發項目的話,可就不是了這麼簡單了.當你參加項目,維護檔案時,就需要更多命令,比如說你我都是某 nasdaq 項目的開發人員:

1,你對某個檔案做了修改,比如說改了ceo.c,加了一行程式:

  printf("where can I find VC to cheat!");

改完之後你要把修改提交給倉庫,用命令:

  $cvs commit -m "add a complain" ceo.c

或者就是:

  $cvs commit -m "worry about money"

讓cvs幫你檢查哪個檔案需要提交.

2,當我開始幹活的時候,可能我先:

  $cvs status

一把,這時候我會看到:

==================================================================File: ceo.c             Status: Needing PatchWorking revision:    1.1.1.1 'Some Date'Repository revision: 1.2     /home/cvsroot/nastaq/ceo.c,vSticky Tag:          (none)Sticky Date:         (none)Sticky Options:      (none)

於是我知道有人改了ceo.c,於是我就:

  $cvs update ceo.c

或者乾脆:

  $cvs update

把ceo.c這個檔案更新為最新版本,然後再幹活.然後提交.

如果這天你修改了coo.c,加了一行

  puts("how about another kind of bragging?");

並且提交了,但是這時候我已經 $cvs status 過了,就是說我不知道你的修改.而我加了一行

  printf("You must shamelessly and seems knowingness to act as a coo");

並且傻乎乎地提交:

  $cvs commit coo.c

這時候,CVS會告訴我

  cvs commit: Examing .cvs server: Up-to-date check failed for 'coo.c'cvs [server aborted]: correct above error first!

於是我知道有個狗屎在我修改檔案的當口做了提交,於是我

$cvs update

這時cvs會報告:

  RCS file: /home/cvsroot/nasdaq/coo.c,vretrieving revision 1.1.1.1retrieving revision 1.2Merging differences between 1.1.1.1 and 1.2 into coo.crcsmerge: warning: conflicts during mergecvs update: conflicts found in coo.cC coo.c

告訴你coo.c有版本衝突,於是我編輯coo.c,這時一般檔案裡看起來象這樣:

  ...printf("You must shamelessly and seems knowingness to act as a coo");<<<<<<< foo.c=======...puts("how about another kind of bragging?");>>>>>>> 1.2...

於是我把上面改成:

  printf("You must shamelessly and seems knowingness to act as a coo");puts("how about another kind of bragging?");

然後

  $cvs commit -m "merged" coo.c

於是下回你再更新的時候就有新的補釘要打...如此往複,直到完成所有修改.不過這裡有一些要注意的地方就是刪除程式,如果你刪掉一行對你可能沒有用的程式

  puts("to be honest");

而我不想刪除(因為我有用),而我不知情地直接:

  $cvs update

了,那麼我的這行程式也完蛋了,所以這裡我們要注意所有開發人員的協調,千萬不要亂刪東西,大不了用

  #if    0#endif

宏定義對括起來.實在要刪東西,那最好先標記一個版本:

  $cvs tag v_0_0_1

然後你發行就緒並刪除你自己的工作目錄裡這個版本的檔案(注意:不是刪除倉庫裡的.):

  $cvs release -d nasdaq

然後你再產生一個新分支:

  $cvs rtag -b -r v_0_0_1 v_0_0_1_1 nasdaq

然後再建立v_0_0_1_1的分支

  $cvs checkout -r v_0_0_1_1 nasdaq

編輯並修改這個分支的檔案,這樣的做法比較好.

不過要注意的是,新標記和新分支的建立最好由項目的管理員負責,否則每個人都做一個分支,那麼倉庫就太亂了.因此,比較的開發人員之間的直接溝通是不能忽略的.一般來說,在互連網上的標準模式是有一個管理員(可能自己並不寫程式),有一個郵遞列表,大家都在郵遞列表上交流看法和做各種決議.當形成決議之後,管理員做一個新版本的標記.以此迴圈.

還有一些命令,比如要增加一個檔案 garbage_china_concept_stocks_list:

  $cvs add garbage_china_concept_stocks_list

然後還要:

  $cvs commit  garbage_china_concert_stocks_list

看起來有點象資料庫裡的事務?的確是這樣.CVS維護著一個本地的參考檔案(在CVS/Entries裡),這樣提交的時候就可以一次地把所有改變放到伺服器端,這樣也更安全.同樣,如果想刪除檔案 bankrupted_web_site:

<per> $rm bankrupted_web_site $cvs remove bankrupted_web_site $cvs commit bankrupted_web_site </pre>

[編輯] 一些小技巧

$Header$ 標記:把這個標記放在檔案的任何地方都會被 cvs 替換成最後修改的 cvs 使用者名稱,該檔案目前的版本號,最後修改時間,該檔案的 cvs 倉庫路徑,看起來象下面這個樣子:

  // $Header: /home/cvsroot/simhost/simhost.cpp,v 1.2 2001/04/20 08:26:10 jqliu Exp $

一般我們把它放在開頭,這樣對程式員修改檔案非常便利,很多時候你只要看一眼開頭就知道檔案是否最新.

$Id$標記:把這個標記放在檔案的任何地方都會被 cvs 替換成最後修改的 cvs 使用者名稱,該檔案目前的版本號,最後修改時間,該檔案的 cvs 倉庫路徑,看起來象下面這個樣子:

  $Id: simhost.cpp,v 1.3 2001/04/24 02:27:36 simhost Exp $

好了,上面所有的東西,估計就是我們用cvs時80%情況下用的命令和內容,包括檔案的更新,提交,衝突的解決,分支的派生,增刪檔案等.實際上cvs的功能之強大,遠遠超出我在這裡描述的內容,我這個"速成"也就管不了太多了,希望隨著時間的推移,我們能夠更加有效地使用CVS.也希望大家能夠不斷補充這篇文章,最後能夠成為手冊,而不僅僅是速成.當然,還要更多地參考別的文檔.

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.