Debian+subversion進行版本控制


2009-05-15 來源:網絡


我,作爲一個系統管理人員來說,真的沒有什麼好東西可以寫,但是唯一有點參考價值的就是自己的一點點小經驗,所謂的經驗:也是從別人的文章學來,之後自己操作實踐變成自己的,HOHO……

兩個月前,公司終於在廣域網架設了一臺linux服務器,剛開始當然就是所謂的http服務、ftp服務……,難道寫這些?但是此類服務文章在網上一搜,到處都是,有何可寫的呢,唉!

終於,自己想到來弄一個版本控制服務器。自己的環境:

system:Debian-sarge3.1-rc1 tools:subversiong、apache2…… 廢話說了一大通,現在我們還是開始吧

1、安裝必要軟件包

SVN最常用的方式是通過Apache2使用(其他方式本文不會涉及,最主要是我也沒做過.^_^),因此需要安裝apache2。在一般情況下,我的服務器上會安裝php,因爲我選擇了apache的apache2-mpm-prefork包。安裝命令:
shell#apt-get install apache2-mpm-prefork libapache2-svn subversion
Debian的包管理系統會自動安裝缺少的包。

2、配置

svn作爲apache2的一個模塊,配置文件在Debian下位於/etc/apache2/mods-available/dav_svn.conf(其他發行版或許有所區別)。首先我們看一個配置文件示例:
<Location /svn>
DAV svn
SVNParentPath /data/svn_repos/
AuthzSVNAccessFile /etc/apache2/erya.authz
AuthType Basic
AuthName "Subversion Repository"
AuthUserFile /etc/apache2/dav_svn.passwd
Require valid-user
</Location>

說明:

a)第一行:<Location /svn>表示svn倉庫位於/svn虛擬目錄下面(Location的作用有點類似Alias的作用)。當然你可以的目錄,比如<Location /src>。那麼這樣配置一般您將可以通過瀏覽器http://hostname/svn進行瀏覽(如果權限足夠的話)。

b)第二行: DAV svn表示dav啓用svn支持。如果您想更詳細瞭解dav是啥去baidu或者google一下,網上資料蠻多的。

c)第三行:SVNParentPath /data/svn_repos表示使用SVNParent方式,並且倉庫的物理路徑爲/data/svn_repos.SVN支持兩種對項目的管理方式,一種是SVNParent,另一種是SVN(?)。我一般更喜歡SVNParent這種方式,因爲使用這種方式添加一個新項目是不需要重啓 apache的,而另一種方式則需要。對於一個實際使用的服務器來說,是否需要常常重啓是一件很重要的事情了。這兒的/data/svn_repos目錄必須是存在而且目錄的屬主應該爲apache的用戶(Debian下一般爲www-data)。mkdir -p /data/svn_repos;chown -R www-data:www-data /data/svn_repos。注意:配置文件默認的是SVNPath,即使用的後一種方式。

d)第四行:AuthzSVNAccessFile /etc/apache2/erya.authz。表示用戶權限文件是/etc/apache2/erya.authz(權限文件的寫法我在後面再說)。文件可以位於任意其他位置。

e)第五至八行:經常配置apache的朋友,我想一定看出來了,這個是apache的配置,使用使用apache的用戶文件作爲身份驗證,需且要求有效用戶纔可以訪問。如果您使用其他用戶管理方式,比如pam,LDAP或者MySQL等都是一樣的。其實在配置文件註釋中已經說明了怎麼樣使用 htpasswd進行用戶管理的方式。在此需要注意的是第四行的配置與此處的配置,在authz權限文件中,只配置哪個用戶是什麼樣的權限,而判斷是否已經通過密碼驗證卻是由apache的用戶管理實現的。也就是說,比如我有一個用戶qsg,那麼判斷這個用戶的密碼是否正確是由此處完成的,而判斷此用戶對哪些項目有什麼樣的權限則是由authz文件完成的。

上面這個配置示例是最簡單的一個配置,其實您還可以通過這個配置xlst文件,以改變通過瀏覽器查看的效果(我嘗試過幾次,不過配置出來的效果比默認更難看,所以索性作罷。)

配置完成後,進入/etc/apache2/mods_enabled查看指向dav_svn.conf和dav_svn.load的文件鏈接是否存在(apache據此啓動模塊)。

3、創建用戶文件

在dav_svn.conf的註釋中已經說明了創建用戶文件的方法:
htpasswd2 -c /etc/apache2/dav_svn.passwd jsz

添加用戶jsz到/etc/apache2/dav_svn.passwd文件中,如果文件不存在,則創建。

4、建立項目倉庫

我們假設您的配置的SVNParentPath目錄是/data/svn_repos。進入/data/svn_repos,此時目錄應該是空的。

創建一個項目倉庫分爲三個步驟:a)建立目錄b)使用svnadmin初始化新項目目錄c)將目錄屬主改爲apache的用戶(本文中我們都假設您使用默認爲www-data用戶)。

我寫了一個小腳本(假設文件名爲createnew):
#!/bin/bash

echo "Create a new resposity ..."
mkdir $1
svnadmin create $1
chown -R www-data:www-data $1

很簡單,三條命令。用法:./createnew test,則我們就建立了一個test項目。建立其他項目也一樣,比如:./createnew project1

執行完以後再查看一下目錄情況下。我們可以進入test目錄看看,它不象CVS一樣,你能夠看到什麼,因爲svn使用了Berkeley數據庫來存放代碼.

5、建議權限文件(authz)

svn授權粒度可以是單獨用戶,也可以是用戶組。

svn的權限分爲三種:無權限,讀權限,讀寫權限。無權限當然是禁止訪問,讀權限也就是說有瀏覽權限,你可以checkout代碼,但不能提交。讀寫權限當然是最大權限了,讀寫添加刪除都可以。

svn的授權深度是它最大的特點了,它不僅可以對整個項目授權,甚至於它可以對項目下的某個目錄,某個文件進行單獨授權。我認爲這是非常有用的一個功能。

咱們還是先來看一個文件示例吧:
[groups]
manager = jsz

user = user1,user2

[test:/]
@manager = rw

[test:/file1]
@manager = rw
user1 =
user2 = rw
先來解釋一下吧:

a)groups區段,就如它的名字所說的那樣,是定義用戶組用的。比如在示例文件中定義了兩個組maanger組和user組。

b)項目區段,每一個區段是一個授權單位。比如示例中有兩個項目區段test:/和test:/file1。對於test:/表示對test項目的根目錄授權,test:/file1表示對test項目下的/file1文件授權(目錄也是一樣)。如果我們還需要對test項目的dir1目錄進行授權,則我們需要再增加一個test:/dir1區段。

c)授權。如果要對某個項目的某部分進行項目組授權,則寫法爲組名前加@符號(如@manager),如果要對單獨用戶授權,則直接爲用戶名。等號(=)後面是權限,有三種寫法:空(無權限),r(讀權限),rw(讀寫權限)。默認爲空,即無權限。

d)權限優先級。您可能已經看到了我在test:/區段對user1授了讀權限,而對user2是無權限,而對於/file1下的文件,我給user1授了無權限,給user2授了讀寫權限。這個就是權限的優先級問題,即目錄越深,權限越是優先。比如test下有一目錄 /dir1/dir2/dir3/dir4/file5,那麼對於用戶user1來說,svn首先檢查是否有針對user1的對file5的授權,若有,則用此授權;如果沒有,再判斷user1對dir4的權限,至到/目錄。如果至根目錄依然沒有設置,則使用默認權限(無權限)。

6、重啓apache

該寫的配置文件都寫了,那我們就重啓一下apache服務吧。/etc/init.d/apache2 restart

然後通過瀏覽器查看一下吧:http://hostname/svn/test

現在因爲我們還沒有往svn是添加任何東西,所以我們看到的是"Revision 0: /"

7、svn的簡單※作

svn※作除了命令行以後,在windows和linux的圖形化界面下,都有相應的客戶端軟件。

a)導入

初始化以後,庫中沒有任何東西,所以我們首先要將我們的內容import進去。

作爲一個演示:
mkdir /tmp/svn
cd /tmp/svn
touch file1

svn import http://hostname/svn/test -m "init" #會提示你輸入用戶名和口令,用戶默認爲當前用戶,如果不正確,直接回車再輸入用戶名
現在通過瀏覽器查看http://hostname/svn/test,我們可以看到現在已經變成"Revision 1: /"而且我們可以看到file1文件也存在了。

b)Checkout

checkout的※作是將代碼從svn服務器上取下來。

繼續上面的演示:
cd ..
rm -rf svn
svn co http://hostname/svn/test #我們看到在tmp目錄下多了一個test目錄。
C)Add和Commit
cd test
vi file1 #修改一下file1文件
touch file2 #新增一個file2文件
svn stat #查看一下當前目錄的文件改動情況
我們看到file2前面是一個問號,表示file2還沒有加到倉庫中。file1前面是一個M,表示修改。
svn add file2 #添加file2,add與import的區別是add並不會直接加到svn服務器上,而import則會。add只是增加了一個添加作業項。
svn ci -m "add file2 and modify file1" #提交

現在通過瀏覽器查看http://hostname/svn/test,我們可以看到現在已經變成"Revision 2: /"而且我們可以看到file2文件也存在了。

8、常見問題

a)配置後通過瀏覽器提示權限禁止

將/etc/apache2/mods-available/dav_svn.conf中的<LimitExcept GET PROPFIND OPTIONS REPORT>行和</LimitExcept>註釋掉。本文僅是一個基本配置,如果您想了解這兩行的含義可以通過網絡搜索一下吧。

最後,如果將subversion結合viewvc使用,那麼基於web的版本瀏覽,就更完美了,推薦一個windows下的客戶端給大家吧,使用TortoiseSVN,有中文包的,使用非常方便。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章