[ 上一頁 ] [ 目錄 ] [ 1 ] [ 2 ] [ 3 ] [ 4 ] [ 5 ] [ 6 ] [ 7 ] [ 8 ] [ 9 ] [ 10 ] [ 11 ] [ 12 ] [ 13 ] [ 14 ] [ 15 ] [ A ] [ 下一頁 ]


Debian 參考手冊
第 12 章 - 版本控制系統


12.1 Concurrent Versions System (CVS)

有關的詳細訊息可使用 lynx 查閱 /usr/share/doc/cvs/html-cvsclient/usr/share/doc/cvs/html-info/usr/share/doc/cvsbook 或執行 info cvsman cvs


12.1.1 安裝 CVS 伺服器

以下設定的步驟,僅允許 "src" 群組的成員存取 CVS 檔案庫,並且僅 "staff" 群組的成員才可管理 CVS,這樣做可以降低管理者不小心犯錯的機會。

     # cd /var/lib; umask 002; mkdir cvs # [Woody] FSH
     # apt-get install cvs cvs-doc cvsbook
     # export CVSROOT=/var/lib/cvs
     # cd $CVSROOT
     # chown root:src .  # "staff" to restrict more for starting project.
     # chmod 3775 .             # 如果上面使用 "staff",則這裡用 2775
     # cvs -d /var/lib/cvs init # 在此明確指定 -d 會更安全!
     # cd CVSROOT
     # chown -R root:staff .
     # chmod 2775 .
     # touch val-tags 
     # chmod 664 history val-tags
     # chown root:src history val-tags

12.1.2 CVS session 範例

下面是設定 shell 環境以便存取 CVS 檔案庫 (repository)。


12.1.2.1 匿名 CVS (僅能下載)

遠端唯讀存取:

     $ export CVSROOT=:pserver:anonymous@cvs.sf.net:/cvsroot/qref
     $ cvs login
     $ cvs -z3 co qref

12.1.2.2 使用本地 CVS 伺服器

透過同一台機器上的 shell 進行本地端存取:

     $ export CVSROOT=/var/lib/cvs

12.1.2.3 使用遠端 CVS pserver

不使用 SSH (在 cvs 中使用 RSH 協議) 遠程存取:

     $ export CVSROOT=:pserver:account@cvs.foobar.com:/var/lib/cvs
     $ cvs login

這個方法有被竊聽攻擊的疑慮。


12.1.2.4 透過 ssh 使用遠端 CVS

透過 SSH 進行遠端存取:

     $ export CVSROOT=:ext:account@cvs.foobar.com:/var/lib/cvs

或以 SourceForge 為例:

     $ export CVSROOT=:ext:account@cvs.sf.net:/cvsroot/qref

你亦可使用 RSA 認證 (以少許密碼連線 – RSA, 第 9.5.3 節),它不需要密碼提示。


12.1.2.5 建立新的 CVS 庫存 (archive)

想要建立如下的檔案,

     ITEM              VALUE               MEANING
     source tree:      ~/project-x         所有的源碼
     Project name:     project-x           專案名稱
     Vendor Tag:       Main-branch         整個分支的標記 (Tag)
     Release Tag:      Release-initial     特定分支的標記

則,

     $ cd ~/project-x                # 進源碼目錄
      ... 建立源碼樹 ...
     $ cvs import -m "Start project-x" project-x Main-branch Release-initial
     $ cd ..; rm -R ~/project-x

12.1.2.6 使用 CVS

使用本地端 CVS 檔案庫來進行 project-x

     $ cd                            # 轉到工作區
     $ cvs co project-x              # 從 CVS 下載源碼到本地端
     $ cd project-x
      ... 修改內容 ...
     $ cvs diff -u                   # 相當於 diff -u repository/ local/
     $ cvs up -C modified_file       # 取消對文件的修改
     $ cvs ci -m "Describe change"   # 將本地端源碼存到 CVS 上
     $ vi newfile_added
     $ cvs add newfile_added
     $ cvs ci -m "Added newfile_added"
     $ cvs up                        # 從 CVS 合併最新版本
      ... 要從 CVS 建立所有新建立的子目錄的話,請改用 "cvs up -d -P"
      ... 注意以 "C filename" 作開頭的行
      ... 沒有變動的碼會移至 `.#filename.version'
      ... 在 filename 中搜尋 "<<<<<<<" 和 ">>>>>>>"
     $ cvs tag Release-1             # 添加 release tag
      ... 繼續編輯 ...
     $ cvs tag -d Release-1          # 移除 release tag
     $ cvs ci -m "more comments"
     $ cvs tag Release-1             # 重新加入 release tag
     $ cd                            # 返回工作區
     $ cvs co -r Release-initial -d old project-x
      ... 取得原版本並放入 old 目錄
     $ cd old
     $ cvs tag -b Release-initial-bugfixes # 建立 branch (-b) tag
      ... 現在你可以對舊版本做修改了 (Tag=sticky)
     $ cvs update -d -P
      ... 源碼樹現在有 "Release-initial-bugfixes" 的 sticky tag
      ... 對分支做修改
     $ cvs up -d -P # 將在這個分支版本上被他人修改的檔案同步化
     $ cvs ci -m "check into this branch"
     $ cvs update -kk -A -d -P
      ... 移除 sticky tag 並取消內容
      ... update from main trunk without keyword expansion
     $ cvs update -kk -d -P -j Release-initial-bugfixes
      ... 將 Release-initial-bugfixes 的分支合併至主要版本
      ... trunk without keyword expansion.  Fix conflicts with editor.
     $ cvs ci -m "merge Release-initial-bugfixes"
     $ cd
     $ tar -cvzf old-project-x.tar.gz old  # 建立壓縮備份, -j 可使用 bz2 格式
     $ cvs release -d old            # 移除本地端源碼(可選)

應該記住的幾個選項(用作 cvs 命令行的第一個參數):

     -n      dry run, no effect
     -t      display messages showing steps of cvs activity

12.1.2.7 從 CVS 匯出 (export) 檔案

要從 CVS 獲得最新版本,用 "tomorrow" :

     $ cvs ex -D tomorrow module_name

12.1.2.8 管理 CVS

為專案加上別名 (alias)(本地伺服器):

     $ su - admin           # staff 成員之一
     $ export CVSROOT=/var/lib/cvs
     $ cvs co CVSROOT/modules
     $ cd CVSROOT
     $ echo "px -a project-x" >>modules
     $ cvs ci -m "Now px is an alias for project-x"
     $ cvs release -d .
     $ exit                 # 或 Ctrl-D 自 su 返回
     $ cvs co -d project px 
      ... 自 CVS 中匯出 project-x (別名: px) 至 direcotry 專案
     $ cd project
      ... 修改內容 ...

12.1.3 CVS 常見問題解決方法


12.1.3.1 容器庫中的檔案權限

CVS 不會覆蓋當前容器中的文件,而是用另一個文件替換它。因此,對檔案庫目錄的寫入權限是很重要的權限。所以如果需要的話,在新建檔案庫時請執行下面的命令,以確保權限的設定。

     # cd /var/lib/cvs
     # chown -R root:src repository
     # chmod -R ug+rwX   repository
     # chmod    2775     repository  # 如果需要的話,對子目錄也做同樣的設定

12.1.3.2 可執行權限 (Execution bit)

當文件被別人匯出後會保留可執行權限。任何時候當你匯出的文件遇到執行權限的問題,可用下面的命令在 CVS 檔案庫中修改文件的權限。

     # chmod ugo-x filename

12.1.4 CVS 命令

這裡是一些 CVS 命令和他們的捷徑的用法。

     {add|ad|new} [-k kflag] [-m 'message'] files...
     {admin|adm|rcs} [rcs-options] files...
     {annotate|ann} [options] [files...]
     {checkout|co|get} [options] modules...
     {commit|ci|com}   [-lnR]  [-m  'log_message'  |  -f  file] \
             [-r revision] [files...]
     {diff|di|dif} [-kl] [rcsdiff_options] [[-r rev1 | -D date1] \
             [-r rev2 |  -D date2]] [files...]
     {export|ex|exp} [-flNn] -r rev|-D date [-d dir] [-k kflag] module...
     {history|hi|his} [-report] [-flags] [-options args] [files...]
     {import|im|imp} [-options] repository vendortag releasetag...
     {login|logon|lgn}
     {log|lo|rlog} [-l] rlog-options [files...]
     {rdiff|patch|pa} [-flags] [-V vn] [-r t|-D d [-r t2|-D d2]] modules...
     {release|re|rel} [-d] directories...
     {remove|rm|delete} [-lR] [files...]
     {rtag|rt|rfreeze} [-falnR]  [-b]  [-d]  [-r  tag  |  -D  date] \
              symbolic_tag modules...
     {status|st|stat} [-lR] [-v] [files...]
     {tag|ta|freeze} [-lR] [-F] [-b] [-d] [-r tag | -D date]  [-f] \
              symbolic_tag [files...]
     {update|up|upd} [-AdflPpR] [-d] [-r tag|-D date] files...

12.2 Subversion

Subversion 是下一代版本控制系統,它將替代 CVS。當前開發者稱它還處於 "alpha" 階段,但對大多數用戶而言它已足夠穩定了。到本文檔寫作之時,Subversion 僅在 Debian unstable 中可用。


12.2.1 安裝 Subversion 伺服器

subversion meta-package 依賴一些相依的套件 (libapache2-svnsubversion-tools) 來設定伺服器。


12.2.1.1 設立檔案庫

當前,subversion 無法建立檔案庫,所以使用者需要手動創建它們。通常會在 /var/local/repos 下建立檔案庫。

創建目錄:

     # mkdir -p /var/local/repos

建立檔案資料庫:

     # svnadmin create /var/local/repos

將容器的寫權限賦給 www server:

     # chown -R www-data:www-data /var/local/repos

12.2.1.2 設定 Apache2

想要用使用者認證來授權存取檔案庫,則添加(或去除注釋)下列內容到 /etc/apache2/mods-available/dav_svn.conf

     <Location /repos>
       DAV svn
       SVNPath /var/local/repos
       AuthType Basic
       AuthName "Subversion repository"
       AuthUserFile /etc/subversion/passwd
       <LimitExcept GET PROPFIND OPTIONS REPORT>
         Require valid-user
       </LimitExcept>
     </Location>

接著,使用下面的命令建立使用者認證檔:

     htpasswd2 -c /etc/subversion/passwd some-username

重新啟動 Apache2,就可以使用 URL http://hostname/repos 來存取新的 subversion 檔案庫了。


12.2.2 將 CVS 檔案庫轉移到 Subversion


12.2.3 Subversion 使用範例

下面的小節將教你如何在 Subversion 下使用各種命令。


12.2.3.1 建立新的 Subversion 保存檔(archive)

要建立新的 Subversion 保存檔,請輸入下面的命令:

     $ cd ~/your-project         # 進入你的源碼目錄
     $ svn import http://localhost/repos your-project \
       project-name -m "initial project import"

這將在你的 Subversion 檔案庫下建立一個名為 project-name 的目錄,用來存放你的專案文件。查看 http://localhost/repos/ 它是否在那兒?


12.2.3.2 使用 Subversion

用 Subversion 來管理 project-y

     $ cd                            # 進入工作區域
     $ svn co http://localhost/repos/project-y  # 匯出源碼
     $ cd project-y
      ... 完成一些工作 ...
     $ svn diff                      # 相當於 diff -u repository/ local/  
     $ svn revert modified_file      # 取消對文件所做的修改
     $ svn ci -m "Describe changes"  # 將你做的修改匯入至檔案庫中
     $ vi newfile_added
     $ svn add newfile_added
     $ svn add new_dir               # 將 new_dir 中的所有文件遞迴地加入檔案庫中
     $ svn add -N new_dir2           # 將 new_dir2 中的文件非遞迴地加入檔案庫中
     $ svn ci -m "Added newfile_added, new_dir, new_dir2"
     $ svn up                        # 從檔案庫中合併最新的版本
     $ svn log                       # 顯示所有已提交的修改記錄
     $ svn copy http://localhost/repos/project-y \
           http://localhost/repos/project-y-branch \
           -m "creating my branch of project-y"  # 建立 project-y 的分支版本
     $ svn copy http://localhost/repos/project-y \
           http://localhost/repos/proj-y_release1.0 \
           -m "project-y 1.0 release"    # 加入 release tag
      ... 注意,分支 (branching) 和標記 (tagging) 是相同的。唯一的不同在分支會提交 (committed) 而標記不會。
     
      ... 對分支版本做修改 ...
     
     $ # 將分支版本回存至主要版本
     $ svn merge http://localhost/repos/project-y \
        http://localhost/repos/project-y-branch
     $ svn co -r 4 http://localhost/repos/project-y # 取得第四版本

[ 上一頁 ] [ 目錄 ] [ 1 ] [ 2 ] [ 3 ] [ 4 ] [ 5 ] [ 6 ] [ 7 ] [ 8 ] [ 9 ] [ 10 ] [ 11 ] [ 12 ] [ 13 ] [ 14 ] [ 15 ] [ A ] [ 下一頁 ]


Debian 參考手冊

CVS, 週一 六月 16 21:20:48 UTC 2008

Osamu Aoki osamu#at#debian.org
Asho Yeh asho#at#debian.org.tw
作者, 第 A.1 節