新聞中心

        EEPW首頁 > CVS完全手冊(一)

        CVS完全手冊(一)

        ——
        作者: 時間:2007-04-05 來源: 收藏

        內容
        概述
        環境設置
        登錄服務器: 
        cvs命令格式
        的日常使用
        其他常用命令
        CVS宏/keyword
        CVS分支管理
        CVS服務器的安裝和配置
        Watchers
        WinCVS的安裝和配置
        CVSWEB的安裝


        概述
        ==================================

        CVS是一個并行版本控制系統,它采用C/S模式,它的復雜度和功能性屬于中等,是當今最流行的版本控制系統。它有兩個基本的特點:
        *保存修改記錄:保存了所有文件的修改歷史,并可以建立分支
        *協作與并行:cvs不推薦使用lock-modify-unlock的串行的工作模式,而采用多人可以并行地修改同一個文件,而在提交時merge conflict;它更適合于大型的工作團體。
        使用CVS的好處:
        *文件集中管理,大家都可以方便的看到所有人員的最新文件,規范化了文件的管理
        *可以查看以前任何的一個版本或修改歷史
        *可以同時維護多個版本和分支


        CVS環境設置
        ==================================

        先不要管CVS服務器的配置,我們先假設已經有一臺配置好的服務器,要訪問CVS,必需先設置環境變量CVSROOT
        CVSROOT=:pserver:user@server#port:/path/to/cvsroot

        *pserver是訪問方式,口令認證的意思,這是最常用的方式,其他還有gserver,kserver,ext
        *user是CVS服務器的用戶名,
        *server是CVS服務器的名稱或者IP地址
        */path/to/cvsroot是你的CVS服務器的CVSROOT目錄,根據你的CVS服務器設置做修改或者詢問管理員
        你可以把設置放到你的shell的profile里(.bash_profile,.profile等)這樣就不用每次敲一長串命令了

        高級功能:現在比較流行是使用ssh來加密口令和數據流
        CVSROOT=:ext:user@server#port:/path/to/cvsroot
        CVS_RSH=ssh
        hints:
        實際上沒有CVSROOT也可以,你可以每次用cvs -d :pserver:user@server#port: /path/to/cvsroot來訪問,而且它將忽略CVSROOT環境變量 ,也許你會笑我只有瘋子才這么用,不過,cvs可以把每次使用的命令參數放到一個文件中,所以在~/.cvsrc中加入
        cvs -d :pserver:user@server#port:/path/to/cvsroot
        即可,它最大的好處是修改了立刻生效,而且它的優先級高于CVSROOT環境變量,到時候不要傻乎乎地來問我,我的環境變量真么不起作用了。


        登錄CVS服務器: 
        ==================================
        $cvs login,這時候cvs會問你口令,請把你在CVS服務器上的口令敲進去
        如果沒有任何錯誤信息,恭喜你,成功了!
        成功登錄后將建立一個~/.cvspass文件,保存你的口令,以后就不用輸入口令了.

        cvs命令格式
        ==================================
        cvs [global_opts] command [command_opts] [command_args]
        Global options 屬于左邊cvs的,是全局的
        command_opts   屬于左邊command的,是局部的
        cvs --help-commands查看命令列表
        cvs -H command/cvs -help command 查看該命令的選項
        hints:如果你每次使用一些命令都帶同樣的參數的話,可以把它們放到~/.cvsrc文件中去
        update -c
        diff -c
        add -kb
        cvs -Q


        cvs global-option comand comand-option arguments

        CVS的日常使用
        ==================================
        CVS使用流程
           a checkout 盡當本地沒有working copy時使用
           b staus 檢查服務器上是否有新版本
           c update 如果有,則用update同步文件
           d 做你自己的修改,并保證正確
           e update 看是否有人修改了你的文件
           f 如果有沖突,合并沖突
           g commit 提交你的修改,如果因為又有人提交修改而失敗,回到e步
           h 回到b步

        1 cvs checkout module_name
        -------------------------------------
        module_name可以暫時理解為目錄名,它會在本地但前目錄下建立module_name目錄,在把服務器上說有module_name目錄下的文件copy到本地module_name目錄下。
        注意:第一次checkout后,就不是通過cvs checkout來同步文件了,而是要進入該目錄下進行具體文件的版本同步(添加,修改,刪除)操作。

        2 cvs update filename
        -------------------------------------
        將文件同步到最新的版本:不指定文件名,cvs將同步所有子目錄下的文件。
        最好每天開始工作前或將自己的工作導入到CVS庫里前都要做一次,并養成"先同步 后修改"的習慣,和Virvual SourceSafe不同,CVS里沒有文件鎖定的概念,所有的沖突是在commit之前解決,如果你修改過程中,有其他人修改并commit到了CVS庫中,CVS會通知你文件沖突
        <<<<<<< filename
         你文件上的內容
        =======
          服務器上文件的內容
        >;>;>;>;>;>;>; latest revision number in the repository

        由你確認沖突內容的取舍。也可以多人協商解決,修改完成后去掉文件中的沖突標志

        conflict:多人修改同一文件的同一區域這就叫沖突,它必須由人來解決,CVS不處理沖突,它只是告訴你存才沖突


        3 cvs commit -m "write some comments here" file_name
        ------------------------------------
        確認修改寫入到CVS庫里。
        注意:CVS的很多動作都是通過cvs commit進行最后確認并修改的,最好每次只修改一個文件。在確認的前,還需要用戶填寫修改注釋,以幫助其他開發人員了解修改的原因。如果不用寫-m "comments"而直接確認`cvs commit file_name` 的話,cvs會自動調用系統缺省的文字編輯器(一般是vi)要求你寫入注釋。
        注釋的質量很重要:所以不僅必須要寫,而且必須寫一些比較有意義的內容:以方便其他開發人員能夠很好的理解
        不好的注釋,很難讓其他的開發人員快速的理解:比如: -m "bug fixed" 甚至 -m ""
        好的注釋,甚至可以用中文: -m "在用戶注冊過程中加入了Email地址校驗"

        修改某個版本注釋:每次只確認一個文件到CVS庫里是一個很好的習慣,但難免有時候忘了指定文件名,把多個文件以同樣注釋commit到CVS庫里了,以下命令可以允許你修改某個文件某個版本的注釋:
        cvs admin -m 1.3:"write some comments here" file_name

        4 查看狀態
        ------------------------------------
        cvs status filename
        狀態報告,類似這樣: 
        File: foo.c             Status: Up-to-date 
           Working revision:    1.1.1.1 'Some Date' 
           Repository revision: 1.2     /home/cvsroot/cvstest/foo.c,v 
           Sticky Tag:          (none) 
           Sticky Date:         (none) 
           Sticky Options:      (none) 

        這里最重要的就是Status欄,這里總共可能有四種狀態: 
        Up-to-date: 表明你要到的文件是最新的. 
        Locally Modified: 表明你曾經修改過該文件,但還沒有提交,你的版本比倉庫里的新. 
        Needing Patch: 表明有個哥們已經修改過該文件并且已經提交了!你的版本比倉庫里的舊. 
        Needs Merge: 表明你曾經修改該文件,但是偏偏有個不識相的也修改了這個文件,而且還提交了!

        5 查看修改歷史和注釋信息
        ------------------------------------
        cvs log file_name


        其他常用命令
        ==================================
        1 添加文件和目錄
        ------------------------------------
        cvs add new_file_name
        cvs add -kb new_file_name
        cvs add dir_name

        CVS一般只處理文本文件,它會擴展keyword(宏)并轉換行結束符
        對于圖片,Word文檔等非純文本的項目,需要使用cvs add -kb選項,否則有可能出現文件被破壞的情況
        然后確認修改并注釋
        cvs ci -m "write some comments here"  new_file_name

        2 刪除文件
        ------------------------------------
        將某個源文件物理刪除后
        cvs remove file_name
        然后確認修改并注釋
        cvs ci -m "write some comments here" file_name

        注意:很多cvs命令都有縮寫形式:commit=>;ci; update=>;up; checkout=>;co; remove=>;rm;

        3.修改文件名
        ------------------------------------
        移動文件:文件重命名
        cvs里沒有cvs move或cvs rename,因為這兩個操作是先cvs remove old_file_name,然后cvs add new_file_name實現的。

        4 目錄結構同步
        ------------------------------------
        如果在你checkout后,有人添加了新的文件或目錄,你需要把他們取出來
        cvs update -d

        5 放棄本地的修改(undo)
        ------------------------------------
        如果修改來了本地文件,不想提交,想重新取新文件
        cvs update -C filename
        它會先把你的本地文件改名

        建議:建議大家把checkout的文件缺省為readonly,把"cvs -r"添加到~/.cvsrc文件中
             這樣,你每次修改一個文件前,先cvs edit filename,提交后文件又變成readonly,
                   如果你想放棄本地的修改,則cvs unedit filename,它會undo,而且文件又變成readonly


        6 恢復到舊版本
        ------------------------------------
        cvs update -j1.20 -j1.15 filenames
        1.20時當前版本號,注意順序不要反了,記住要commit,為了保證是但前版本號,最好先lock
        注意:cvs update -r1.15 file.name,這里的-r不是版本號的意思,是給文件加了一個叫1.15的sticky tag
        如果不小心已經加成STICK TAG的話:用cvs update -A 解決

        7 文件比較
        ------------------------------------
        cvs diff -c filename
        cvs diff -c -r1.8 -r 1.5 filename

        8 鎖定與解鎖文件
        ------------------------------------
        為保證串行的修改文件,或修改二
        cvs admin -l files
        cvs admin -u files


        ==========================================================================
        如果你只是一般性的使用cvs,到此為止就足夠了。一個系統20%的功能往往能夠滿足80%的需求,CVS也不例外,以下是CVS最常用的功能,可能用到的還不到它全部命令選項的10%,更多的功能請在實際應用過程中體會,學習過程中應該是用多少,學多少,用到了再學也不遲。
        ==========================================================================

        CVS宏/keyword
        ==================================
        CVS缺省會對文件進行keyword(宏)替換,在文件中加入這些關鍵字是個良好的工作習慣
        $Id$ 關鍵字是用文件名、版本、時間、作者 及代碼性質替換,如果使用-l選項取出,在Exp后
        面會加上登錄用戶的名稱。除了$Id$關鍵字,RCS還支持下面常用的關鍵字:
        $Log$ : 你所提供的修改日志信息。
        $Author$ :存入該版本的作者。
        $Locker$ : 該版本的加鎖者
        $State$ : 該版本的狀態 Exp(試驗版), Stabe(穩定版), Rel(發行版).缺省是Exp
        $Date$ : 該版本存入的時間,使用UTC時間格式。
        $Revision$ : 該版本的版本號
        $RCSfile$ : RCS文件名
        $Source$ : RCS全路徑名
        $Name$ : 取回該版本的符號名
        $Header$ : 相當于$ Source $$ Revision$$Date$$Author $$State$$Locker$的組合


        Sticky Tag
        ==================================
        tag的作用是對多個連續變化的文件做一個快照來表示某一時刻的所有不停內部版本的文件,一般是項目到一定階段,可以給所有文件統一指定一個階段里程碑版本號,需要的時候可以一次導出這些版本不一的文件.標記的另外一個非常重要的作用是生成分支和合并分支.
        1 cvs tag release_name  module_name
        ------------------------------------
        release_name要簡潔而含義豐富,由字母開頭,加字母,數字,下劃線和連字號組成,特別是不能含“.”
        2 cvs checkout -r release_name module_name
        ------------------------------------
        取出tag_name標志的文件
        3 cvs update -A
        ------------------------------------
        tag標識的文件是歷史文件,不能修改,這樣可在本地去除這個限制,讓它和當前版本合并



        關鍵詞: CVS

        評論


        技術專區

        關閉
        主站蜘蛛池模板: 德化县| 新巴尔虎左旗| 定南县| 扎兰屯市| 讷河市| 河东区| 巴东县| 永济市| 县级市| 五河县| 乌苏市| 宁陵县| 山阳县| 包头市| 怀仁县| 伊金霍洛旗| 宝兴县| 修武县| 南丹县| 苍溪县| 衡南县| 西乌珠穆沁旗| 河南省| 新巴尔虎右旗| 宿迁市| 金昌市| 夹江县| 辽源市| 临洮县| 仁怀市| 汪清县| 息烽县| 阿拉善右旗| 灵寿县| 利辛县| 永川市| 酒泉市| 高平市| 岳阳县| 安乡县| 巧家县|