Linux 學習筆記(十一S)版本控制

1 RCS: 版本控制系統

RCS (Revision Control System) 是現存的最古老的 UNIX 應用程序之一。如果您把文件 /etc/rsyslog.conf 置於 RCS 的控制之下,那麼 RCS 會將它的各個版本保存在 /etc/rsyslog.conf,v 裏。

爲了減少混亂,RCS 在和原來文件相同的目錄下尋找一個叫做 RCS 的目錄。如果有這個目錄,RCS 就把 ,v 文件放在那個目錄裏,這樣一來,列出的目錄內容就會變得清楚多了,因爲許多文件都可以共享 RCS 目錄。這是一種很棒的功能,而且也是我們極力推薦的一種做法。您確實需要知道的 RCS 命令只有幾個: ci 用於檢入, co 用於檢出,而 rcs 執行各種維護工作。如果您使用的編輯器是 emacs, 那麼就完全不必使用命令行工具了,因爲 emacs 內置了對 RCS 的支持。

要讓一個文件開始處於 RCS 的跟蹤之下,可以像下面這樣在這個文件上運行 ci:

$ ci -u filename
RCS/filename,v <-- filename
enter description, terminated with single '.' or end of file:
NOTE: This is NOT the log message!
>> This is the orgmode file.
-u 標誌讓 ci 立即以一種未上鎖(不可編輯)的狀態檢出 filename 文件。如果您省略了這個標記,那麼 ci 就會梌這個文件,然後刪除原來的副本,這或許並不是您想要的做法。

您每次想要改變一個受 RCS 控制的文件時,都必須檢出它,並用 co -l 命令對它上鎖:

$ co -l filename

如果您使用 emacs, 那麼就更方便了,只需打開受 RCS 控制的文件,然後 C-x v v 就可以實現文件檢出和上鎖。當你對所做的修改感到滿意時就可以使用 ci -u 命令將它簽入,這時 RCS 會要求你提供一條註釋,說明您剛纔做的是什麼。雖然人們傾向於路過這步,或者寫些諸如“做了一次修改”這樣的無用信息,但是應該堅持加註釋這個習慣。在兩年以後,當您要弄清楚爲什麼要做改動的時候,有幫助的註釋會救您一命。在 emacs 裏面,當您寫完註釋後就可以使用 C-c C-c 將 frame 關掉同時簽入 RCS。

$ ci -u filename
RCS/filename,v <-- filename
new revision: 1.2; previous revision: 1.2
enter log message, terminated with single '.' or end of file:
>> Started describe what I gonna do in this week
>> .
done
當您需要比較兩個版本之間的差別的時候, rcsdiff 是一個非常好的幫手,它是一個能懂 RCS 的 diff 版本。
$ rcsdiff filename
但我會建議您使用 emacs 來做這件事,因爲它的 Diff 模式相當地智能,能夠將修改的地方高亮顯示出來,利用 TAB, np 鍵能夠在不相同處進行跳轉, o 或者 RET 鍵能夠輕鬆地打開源文件進行查看。

您可能還需要用 rlog 命令查看一下文件的版本歷史信息:

$ rlog filename
如果您想要看看文件在換到新文件之前的樣子,可以用 co-r 選項檢出這個文件的 1.2 版,不過在做這事之前最好已經將最新的版本簽入到 RCS 中,否則它會用老版本替換當前的 filename 文件:
$ co -r1.2 filename

2 CVS: 併發版本系統

CVS (Concurrent Version System, 併發版本系統) 是目前在 UNIX 和 Linux 系統上使用最爲廣泛的版本控制系統。

CVS 背後的主要思想之一是項目文件(及其歷史版本)都保存在一箇中心位置。和在 RCS 系統中一樣,您要簽出要開始在上面工作的文件,然後做完修改之後把這些文件再次簽入到代碼庫裏。CVS 的優勢在於,它沒有“上鎖”和“解鎖”檢出的概念,基於人可以同時檢出並修改文件(“併發”由此得名)。

下面從用戶的角度快速列舉一下最重要的 CVS 命令。修改一個項目的第一步是登錄到服務器,檢出想要改動的模塊。我們在這裏要修改的模塊叫做 sort:

$ cvs -d :pserver:user@server:/path/to/repository login
CVS password: <password>
$ cvs -d :pserver:user@server:/path/to/repository co sort
其中 pserver 是聯絡代碼庫所用的訪問方法,本例中的代碼庫是一個專用的 CVS 口令服務器. login 操作把口令與服務器的口令進行對照檢查,並且保留口令的一個副本,供以後的交互使用. co 操作直接類似於 RCS 的同名命令。

現在可以進行 sort 目錄在本地的副本,開始編輯文件。當您準備把文件再次簽入 CVS 庫的時候,不需要使用 -d 選項,因爲 CVS 在子目錄 sort/CVS 裏留下了一份所有必須的本地信息。

$ cvs commit foo.c -m "Added more efficient sort routine"
如果您已經在模塊的副本上工作了一段時間,想要用其他人自從您檢出該文件後已經對它做的修改來刷新本地副本,可以使用 cvs update 命令. -d 選項的意思是要包括所有的子目錄,而 -P 選項則要求 CVS 刪除任何空目錄。
$ cvs update -dP

3 Subversion: 做得好的 CVS

雖然 CVS 是當前佔據主導的版本控制系統,但是我們建議系統管理員從 RCS 直接跳到 Subversion。這個軟件包的官方網址是 http://subversion.tigris.org/,不過現在已經在使用新的網址 http://subversion.apache.org/ 了。因爲 Subversion 所使用的 License 就是 Apache License。

接下來我將要在我的 ubuntu 12.04 系統上安裝並配置 subversion,雖然我所選用的發行版本是 ubuntu 但是我相信其中的絕大部分內容和操作都應該同樣適用於其他的發行版本,甚至同樣是 ubuntu 的其他時期的發行版。

首先,安裝所需要的軟件包:

$ sudo apt-get install subversion
$ sudo apt-get install libapache2-svn
稍等片刻,安裝好軟件之後就開始對其進行配置。這時候需要先創建一個 SVN 倉庫(Repository),許多位置都可以放置 Subversion 文件倉庫,我選用的位置是 /home/svn, 因爲這是我的一個空間非常大的硬盤,足足 1 TB 的說。:)
$ sudo mkdir /home/svn
$ cd /home/svn
$ sudo svnadmin create softplayer
$ sudo chown -R www-data:www-data softplayer
其中的 www-dataapache2 默認的用戶和組,我將使用 http 的方式對 Subversion 文件倉庫進行訪問,所以我將 softplayer 這個 Subversion 倉庫的屬主和屬組都修改成 www-data, 如果不修改的話,會出現提交不了文件的錯誤,沒權限呀,你懂的!

接下來,創建 /etc/subversion/passwd 文件,該文件包含了能夠使用 Subversion 文件倉庫的用戶的授權信息。

$ sudo htpasswd -c /etc/subversion/passwd user_name
上面的 user_name 需要根據您實際的情況來進行分配,比如是 david 或者 john 等用戶. -c 選項表示創建新的 /etc/subversion/passwd 文件,所以 user_name 所指的用戶將是文件中唯一的用戶。如果要添加其他用戶,則去掉 -c 選項即可,比如像下面的命令一樣:
$ sudo htpasswd /etc/subversion/passwd another_name
Subversion 文件倉庫的訪問分爲以下幾種:

mode access
file:// 直接訪問本地硬盤上文件倉庫
http:// 通過 WebDAV 協議訪問支持 Subversion 的 Apache2 Web 服務器
https:// 類似 http:// 支持 SSL 加密
svn:// 通過自帶協議訪問 svnserve 服務器
svn+ssh:// 類似 svn:// 支持通過 SSH 通道

要通過 WebDAV 協議訪問 SVN 文件倉庫,還必須配置一下 Apache2 Web 服務器。在 /etc/apache2/mods-available/dav_svn.conf 文件中寫入以下代碼:

<Location /svn>
DAV svn
SVNParentPath /home/svn
AuthType Basic
AuthName "subversion repository"
AuthUserFile /etc/subversion/passwd
  #<LimitExcept GET PROPFIND OPTIONS REPORT>
    Require valid-user
  #</LimitExcept> 
</Location>
如果需要用戶每次登錄時都進行用戶密碼驗證,請將 <LimitExcept GET PROPFIND OPTIONS REPORT> 與 </LimitExcept> 兩行註釋掉。

當您添加了上面的內容,您必須重新起動 Apache 2 Web 服務器,請輸入下面的命令:

$ sudo /etc/init.d/apache2 restart
好的,這時就可以嘗試着使用瀏覽器打開 http://localhost/svn/softplayer 這個地址啦,能夠正常打開,perfect. 裏面是空的,當然啦,還沒有導入數據進去嘛!

接着就是將數據 import 到 Subversion 倉庫啦:

$ svn import /path/data http://localhost/svn/softplayer -m "Initial import."
導入成功之後,刷新瀏覽器,同時也可以在瀏覽器上看到所做的更新!

接下來的工作就是將 Subversion 倉庫中的文件 checkout 出來,修改或刪除,再 commit 回去:

$ svn co http://localhost/svn/softplayer SoftPlayerBeta --username david
我使用剛纔 htpasswd 命令創建的 david 用戶名 checkout softplayer 到 SoftPlayerBeta 文件夾中,此時會提示輸入密碼。如果遇到 Password for ‘(null)’ GNOME keyring: 問題的時候可以直接
$ rm ~/.gnome2/keyrings/login.keyring
原因是 svn 和 gnome 的一個 key 衝突了。

這時進入 SoftPlayerBeta 文件夾中,修改其中的文件,比如說 foo.c 文件,成功修改後,直接

$ svn ci foo.c -m "Making a testing comment."
就可以將修改提交到 Subverion 庫裏。也可以使用 svn add filename.ext 或者 svn del filename.ext 添加到庫裏或者從庫中刪除 filename.ext 文件,更多 svn 命令的使用可以在命令行中輸出 svn help 進行查看。

但是說實在話,直接通過命令來操作 svn 的情況還是比較少見的,更多時候,是通過集成到開發環境中的版本控制管理插件來對文件的版本進行操作,如果您使用 emacs 那麼在 Tools 菜單中就已經提供了 Version Control 的菜單項,方便對受版本控制器管理的文件進行操作;如果是使用 eclipse 來進行開發,那麼在 eclipse 世界裏就已經有非常方便實用的 subclipse 插件來對操作 Subverion,並且還是 GUI 界面的,非常地棒!

更多關於 Subversion 的信息可以參考以下的網址:

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章