有關的詳細訊息可使用 lynx
查閱
/usr/share/doc/cvs/html-cvsclient
,
/usr/share/doc/cvs/html-info
,/usr/share/doc/cvsbook
或執行 info cvs 及 man 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
下面是設定 shell 環境以便存取 CVS 檔案庫 (repository)。
遠端唯讀存取:
$ export CVSROOT=:pserver:anonymous@cvs.sf.net:/cvsroot/qref $ cvs login $ cvs -z3 co qref
透過同一台機器上的 shell 進行本地端存取:
$ export CVSROOT=/var/lib/cvs
不使用 SSH (在 cvs
中使用 RSH 協議) 遠程存取:
$ export CVSROOT=:pserver:account@cvs.foobar.com:/var/lib/cvs $ cvs login
這個方法有被竊聽攻擊的疑慮。
ssh
使用遠端 CVS透過 SSH 進行遠端存取:
$ export CVSROOT=:ext:account@cvs.foobar.com:/var/lib/cvs
或以 SourceForge 為例:
$ export CVSROOT=:ext:account@cvs.sf.net:/cvsroot/qref
你亦可使用 RSA 認證 (Connecting with fewer passwords – RSA, 第 9.5.3 節),它不需要密碼提示。
想要建立如下的檔案,
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
使用本地端 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
要從 CVS 獲得最新版本,用 "tomorrow" :
$ cvs ex -D tomorrow module_name
為專案加上別名 (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 ... 修改內容 ...
CVS 不會覆蓋當前容器中的文件,而是用另一個文件替換它。因此,對檔案庫目錄的寫入權限是很重要的權限。所以如果需要的話,在新建檔案庫時請執行下面的命令,以確保權限的設定。
# cd /var/lib/cvs # chown -R root:src repository # chmod -R ug+rwX repository # chmod 2775 repository # 如果需要的話,對子目錄也做同樣的設定
當文件被別人匯出後會保留可執行權限。任何時候當你匯出的文件遇到執行權限的問題,可用下面的命令在 CVS 檔案庫中修改文件的權限。
# chmod ugo-x filename
這裡是一些 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...
Subversion 是下一代版本控制系統,它將替代 CVS。當前開發者稱它還處於 "alpha" 階段,但對大多數用戶而言它已足夠穩定了。到本文檔寫作之時,Subversion 僅在 Debian unstable 中可用。
The subversion-server
meta-package 依賴一些相依的套件
(libapache2-dav-svn
和 subversion-tools
)
來設定伺服器。
當前,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
想要用使用者認證來授權存取檔案庫,則添加(或去除注釋)下列內容到
/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 檔案庫了。
下面的小節將教你如何在 Subversion 下使用各種命令。
要建立新的 Subversion 保存檔,請輸入下面的命令:
$ cd ~/your-project # 進入你的源碼目錄 $ svn import http://localhost/repos your-project \ project-name -m "initial project import"
這將在你的 Subversion 檔案庫下建立一個名為 project-name 的目錄,用來存放你的專案文件。查看 http://localhost/repos/ 它是否在那兒?
用 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 # 取得第四版本
Debian 參考手冊
CVS, 週一 四月 3 22:58:37 UTC 2005osamu@debian.org
asho@debian.org.tw