CentOS 上的 Subversion
Subversion 不是單單為程式編寫員而設的……我知道,因為我就不是。最近我開始用它來做後多事情,例如:備份 Nagios 的設定、文件、及任何以文字為基礎的東西。我不知道因何我沒有更早使用它,但無論如何,事情就是這樣了。這份文件簡捷地解釋安裝及設定 subversion,及如何在本地和在聯網上通過 Apache 使用它。請參閱它所提供的文檔關於完整、複雜的設定及安裝。其實坊間有很多關於這個題材的優秀文檔,所教授的遠超過我對這個工具的認識。假如你像我一樣喜歡嘗試新的事物,這份文檔可以幫助你快速入門。
1. 系統
CentOS 4.x/RHEL 4
CentOS 5.1/RHEL 5
2. 參考
Subversion: http://subversion.tigris.org/
Version Control with Subversion: http://svnbook.red-bean.com/
3. 安裝
[root@lucifer ~]# yum install mod_dav_svn subversion
你首先要做的事情就是安裝我在上面所提及的兩個套件。如果你未安裝 Apache,這樣做亦會為你把它拉進來。
當你用 yum 安裝時,它會列出上面兩個套件以外的套件。其它東西亦會自動被安裝。視乎你已有的套件,你的經歷也許會不同。
4. 設定
4.1. Apache
在你進一步學習之先,你需要確定 Apache 已經被設置好。我假設你在做一個全新的安裝,因此如果你的 Apache 已經在運作中……請小心你所做的改動。我亦會解釋如何設置基本的密碼保護。然而,假若你想容許任何人存取版本庫,你可輕易地省略這部份。
你首先要做的事情就是開啟 /etc/httpd/conf/httpd.conf,而且最低限度更改 ServerName 這個指引。如果你需要協助或擁有更複雜的設定,請參詳 Apache 的文件。
[root@lucifer ~] vim /etc/httpd/conf/httpd.conf —— 作所需修改並存檔 [root@lucifer ~] service httpd start [root@lucifer ~] chkconfig httpd on
在網絡上瀏覽你的機器,http://yourmachine ,看看你能否取得測試頁。做得到嗎?好了,讓我們進到更有趣的事情。
4.2. Subversion 給 Apache 的設定
下一步就是在 Apache 內設置某些設定,好讓 Subversion 與 Apache 能夠融洽相處。現在讓我們看看 Subversion 為你安裝的範例設定檔。
[root@lucifer ~] cd /etc/httpd/conf.d/ [root@lucifer ~] vim subversion.conf # 有需要的話,請確定你移除這兩行的註釋 LoadModule dav_svn_module modules/mod_dav_svn.so LoadModule authz_svn_module modules/mod_authz_svn.so # 加入下列內容來支援基本驗證,並將 Apache 指向實際放置版本庫的地方。 <Location /repos> DAV svn SVNPath /var/www/svn/repos AuthType Basic AuthName "Subversion repos" AuthUserFile /etc/svn-auth-conf Require valid-user </Location>
上面的位置是 Apache 在 URL 列上使用的。舉個例說:http://yourmachine/repos 指向你所指定的 SVNPath。上面只是一個範例,因此請按你的喜好放置東西。請確定你在完成編輯後儲存檔案。
然後我們須要建立你在上一部所指定的密碼檔。開始時你要利用 -cm 這個選項。它會建立檔案並用 MD5 將密碼加密。如果你需要加用戶,請確定你只使用 -m 選項,而不包含初次建立時的 -c。
[root@lucifer ~] htpasswd -cm /etc/svn-auth-conf yourusername New password: Re-type new password: Adding password for user yourusername [root@lucifer ~] htpasswd -m /etc/svn-auth-conf anotherusername New password: Re-type new password: Adding password for user anotherusername
4.3. 設定你的版本庫
你接著要做的事情就是建立你用來提交及取出檔案的版本庫。利用 svn 所包含的工具,這是很容易的。
[root@lucifer ~] cd /var/www/ —— 或者你在上面所指定的路徑 [root@lucifer ~] mkdir svn [root@lucifer ~] cd svn [root@lucifer ~] svnadmin create repos [root@lucifer ~] chown -R apache.apache repos [root@lucifer ~] service httpd restart
現在去測試你能否透過網頁瀏覽器存取你的版本庫:http://yourmahcine/repos 。你應該取得一個對話方塊詢問用戶名稱及密碼。若然是這樣,請輸入你的憑證,然後你應該看見一版 Revision 0:/ 的頁面。這樣的話,版本庫的設定便大工告成了。如果你須要多個版本庫,請參考上面連結內的文檔。這裡只示範如何設置一個版本庫及開始應用它。話說回來,讓我們就這樣做。
5. 運用 subversion
5.1. 配置你的版本庫
如果一切順列,你現在應該已準備好使用你所建立的版本庫。subversion 的 svn 工具是你將要用來與資料庫溝通的指令行客戶端。若要看這個工具的用法:
[root@lucifer ~] svn --help
你最有機會使用的選項是:svn import、svn commit(ci)、svn checkout(co)。開始時你會用 import 將檔案匯入你的版本庫;你會用 checkout 取出它們作修改;你會用 commit 將改動提交到資料庫內。一旦你見過它們被應用數次,這便頗為簡單。
在我繼續之先,我希望解釋關於目錄架構的配置。幾乎所有文件都談及用某個配置方法建立你的目錄。他們會提及要確定你在根目錄下設有 branches、tags 及 trunk 目錄,當中 trunk 會包含你的所有檔案。就例如:
. |-- project1 | |-- branches | |-- tags | `-- trunk `-- project2 |-- branches |-- tags `-- trunk
參考書會較詳細解釋這樣做的原因,但我基本上不會採用這種配置……這是因為我不算是寫程式或維護「項目」。我主要用它來儲存相對簡單的設定檔及文件。請用適合你的方式來設置。
作為一個範例,我會建立一些示範用的目錄及放置一些檔案在其中。這是在 SVN 伺服器上做的。請照樣做。
[root@lucifer ~] cd /tmp [root@lucifer ~] mkdir mytestproj [root@lucifer ~] cd mytestproj [root@lucifer ~] mkdir configurations options main [root@lucifer ~] vim configurations/testconf1.cfg —— 放你喜歡的東西在這些檔案內。 [root@lucifer ~] vim options/testopts1.cfg [root@lucifer ~] vim main/mainfile1.cfg
請記得你可以隨你的自己的意思進行配置。當你完成了你所須的首個配置後,讓我們向前進並將它匯入 subversion 內。
5.2. 匯入
[root@lucifer ~] svn import /tmp/mytestproj/ file:///var/www/svn/repos/mytestproj -m "Initial repository layout for mytestproj" Adding /tmp/mytestproj/main Adding /tmp/mytestproj/main/mainfile1.cfg Adding /tmp/mytestproj/configurations Adding /tmp/mytestproj/configurations/testconf1.cfg Adding /tmp/mytestproj/options Adding /tmp/mytestproj/options/testopts1.cfg
5.3. 取出
現在利用網頁瀏覽器取出檔案:http://yourmachine/repos 。你應該能夠取出你所匯入的東西。一旦你在本地的 SVN 伺服器上載了你最初的配置,你只需用先前所建立的戶口連線到 subversion 伺服器,便可以在另一台遠端的機器上使用它。讓我們測試一下。
[me@mylappy ~] cd /tmp [me@mylappy ~] svn co http://yoursvnserver/repos/mytestproj Authentication realm: <http://yoursvnserver:80> Subversion repos Password for 'youruser': A mytestproj/main A mytestproj/main/mainfile1.cfg A mytestproj/configurations A mytestproj/configurations/testconf1.cfg A mytestproj/options A mytestproj/options/testopts1.cfg Checked out revision 1.
5.4. 編輯及提交
正如你所見,你已經從 subversion 伺服器取出了第 1 版。現在你可以編輯一些東西,然後將改動提交給 subversion 伺服器。
[me@mylappy ~] cd mytestproj [me@mylappy ~] vim configurations/testconf1.cfg —— 加入或刪除某些東西並存檔。 [me@mylappy ~] svn commit -m "Added a line to testconf1.cfg." Sending configurations/testconf1.cfg Transmitting file data . Committed revision 2.
這樣做的一個好處,就是你可以刪除剛才在你的機器上所取出的所有目錄。你取出它們的唯一目的,就是要編輯它們,然後將它們送返主機。請瀏覽你的伺服器來取出不同檔案。
5.5. 新增/刪除物件
這一切都很好,但你如何在現存的版本庫內加入更多檔案?很簡單,就是利用 add 這個引數。請你現在就取出你最新的版本,複製一個檔案到目錄內,加入這個檔案,然後提交你的改動。
[me@mylappy ~] svn co http://yoursvnserver/repos/mytestproj A mytestproj/main A mytestproj/main/mainfile1.cfg A mytestproj/configurations A mytestproj/configurations/testconf1.cfg A mytestproj/options A mytestproj/options/testopts1.cfg Checked out revision 2. [me@mylappy ~] cd mytestproj [me@mylappy ~] cp /etc/yum.repos.d/CentOS-Base.repo configurations/ [me@mylappy ~] svn add configurations/CentOS-Base.repo A configurations/CentOS-Base.repo [me@mylappy ~] svn commit -m "Added the CentOS Yum repo file." Adding configurations/CentOS-Base.repo Transmitting file data . Committed revision 3.
要刪除物件,你只須以 delete 代替 add。提交你的改動,然後便成了。就是這麼簡單。再次返回你的瀏覽器,你會發現版本號碼是 3。你應該可以點擊檔案並找出你所做的改動。
5.6. 還原
這些都非常好,但我如何還原到舊的版本……這不是 subversion 的用意嗎?對,這很容易。好果你不清楚你現有的版本……看看 log 這個指令。這解釋了你為何每次提交時要放入信息。它們要簡潔,但含足夠資料來提醒你或許忘掉了的事情。
[me@mylappy ~] svn log http://yoursvnserver/repos —— 這針對整個版本庫 [me@mylappy ~] svn log http://yoursvnserver/repos/mytestproj —— 這針對個別項目
你會取得一個完整的版本列表連同註解,正如我上面所講。這樣你便能選擇你現在想取回哪個版本。
[me@mylappy ~] svn co -r 1 http://yoursvnserver/repos/mytestproj
這個指令會取回第 1 個版本。
6. 存取控制清單
一般來說,你不會想將所有版本庫的存取權給予所有用戶。你可以利用 ACL 來限制每位用戶存取版本庫的權限。ACL 可以透過 AuthzSVNAccessFile 這個檔案選項來啟用,它以一個檔名作為參數。例如:
AuthzSVNAccessFile /etc/svn-acl-conf
你可以在相關的 Location 部份加入它:
<Location /repos> DAV svn SVNParentPath /var/www/svn/repos AuthzSVNAccessFile /etc/svn-acl-conf AuthType Basic AuthName "Subversion repos" AuthUserFile /etc/svn-auth-conf Require valid-user </Location>
然後你可以建立 /etc/svn-acl-config。這個檔案內藏有這個格式的分段:
[版本庫名稱:版本庫路徑] 用戶 = 存取權
當中存取權可以是 r(唯讀)、rw(讀寫)、或空白(禁止存取)。預設的 ACL 是禁止用戶存取版本載。假設你有一個名叫 framework 的版本庫,而你想給 john 唯讀的權限,及 joe 讀寫的權限。你可以加入下面這個分段:
[framework:/] john = r joe = rw
你亦可以在名叫 groups 的分段內建立群組,然後在存取控制清單內將 @ 符號放在群組前面。例如:
[groups] staff = joe, george [framework:/] john = r @staff = rw
如果你想令所有用戶能閱讀每個版本庫,你可以為每個版本庫的根目錄加入以下一個分段:
[/] * = r
7. 後記
這只是 subversion 能賦予你的能力的很小部份。這份入門指南能助你一把,初步示範如何使用它,並理解它的運作。你可以用 subversion 的工具做各樣事情,所以請記得查閱文檔來學習關於可以協助你的不同選項。另外請留意為你的需要安裝 Apache 也許是小題大做。要完全使用 subversion 的工具,你可以在本地的機器上指定 file:///path/to/repo ,而不必像我的 Apache 範例般使用 http://yoursvnserver/repos/whatever 。據聞很多人都在他們的主機上用它來管理大型項目及設定檔,免得自己發瘋。祝你好運。
8. 進深閱讀
Translation of revision 15