[FrontPage] [TitleIndex] [WordIndex

This is a read-only archived version of wiki.centos.org

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


2023-09-11 07:23