Subversion是一個自由、開放源代碼的版本控制系統。它是一個通用系統,可用來管理任何類型的文件,其中包括程序源碼。
它的初始目標很明確,實現絕大部分CVS的已有功能;充分考慮現有的CVS用戶,在使用方式上模仿CVS,同時開發了一系列工具,使得基於CVS的項目能夠順利遷移到Subversion上。和CVS相比,它有很多優點,例如目錄版本控制、不可分割的提交、一致的數據處理方式和更有效率的分支與標記等。
Subversion有兩種運行方式,一種是基於Apache Http Server的Subversion,另一種是Subversion 獨立服務。下面我做的是基於Apache Http Server的Subversion,這樣做的好處是:A能使用WebDAV協議。B能使用瀏覽器作爲客戶端工具瀏覽源碼倉庫。C可以很容易的支持到SSPI和LDAP,這些都是Apache本身就支持的。D能得到比較完善的Apache安全認證系統。
下面是安裝與配置
一、 首先準備好相關的安裝包,我這裏使用的是下列的幾個包
Apr:apr-1.4.2.tar.gz和 apr-util-1.3.10.tar.gz
Apache:httpd-2.2.22.tar.gz
Subversion:subversion-1.6.15.tar.gz和subversion-deps-1.6.15.tar.gz
二、 安裝和配置步驟
1、 安裝apr-1.4.2
#tar –zvxf apr-1.4.2.tar.gz
#cd apr-1.4.2
#./configure 安裝不指定路徑時 默認安裝到/usr/local/apr
# make
#make install
2、 安裝apr-util-1.3.10
#tar –zxvf apr-util-1.3.10.tar.gz
#cd apr-util-1.3.10
#./configure --with-apr=/usr/local/apr
#make && make install
3、安裝httpd-2.2.22.tar.gz
#tar zxvf httpd-2.2.22.tar.gz
#
cd httpd-2.2.22
#./configure --prefix=/usr/local/apache \
--with-apr=/usr/local/apr/bin/apr-1-config \
--with-apr-util=/usr/local/apr/bin/apu-1-config \
--enable-modules=so --enable-dav --enable-maintainer-mode --enable-rewrite
#make
#make install
安裝好後啓動apache
# /usr/local/apache/bin/apachectl -k start
用瀏覽器查看http://192.168.254.131,得到it works,說明apache已經配置成功了。
4、 安裝和配置Subversion
# tar zxvf subversion-1.6.15.tar.gz
# tar zxvf subversion-deps-1.6.15.tar.gz
# cd subversion-1.6.15
# rm -rf apr
# rm -rf apr-util
注意:SVN 依賴的APR版本要正確。如果Apache爲2.0.x,對應的APR版本應爲0.9.x;Apache爲2.2.x,對應的APR版本應爲1.2.x。由於subversion-deps包裏的APR是0.9.x的,因此編譯svn時要刪除從deps裏解壓出來的apr, apr-util,改而使用apache 2.2裏提供的。(這裏指定爲開始安裝的apr目錄),這一點知識非常重要,自己之前多次安裝都沒成功,現在才明白是在這一點被卡住了,但最終還是被我解決了, 學習,和不斷實踐 會使你不斷成長!
# ./configure --prefix=/usr/local/svn --with-apxs=/usr/local/apache/bin/apxs /--with-apr=/usr/local/apr/bin/apr-1-config --with-apr-util=/usr/local/apr/bin/apu-1-config --with-ssl --enable-maintainer-mode
#make
#make install
確定下svn有沒有安裝成功
#/usr/local/svn/bin/svnserve --version
會看到相關版本信息!
之後再看看apache 的相關模塊有沒有加載!如下:
LoadModule dav_svn_module modules/mod_dav_svn.so
LoadModule authz_svn_module modules/mod_authz_svn.so
下面開始建立版本庫
# mkdir -p /home/svndata
# chown -R apache.apache /home/svndata
# chmod -R 755 /home/svndata
# /usr/local/svn/bin/svnadmin create /home/svndata/www/ 創建倉庫爲“www”
#ls /home/svndata/www 查看有沒有創建好,如果多了一些文件則說明版本庫已經創建好
5、 配置apache支持svn
# vi /usr/local/apache/conf/httpd.conf
找到 User daemon 改爲 User apache
找到 Group daemon 改爲 Group apache
在配置文件末尾添加
<Location /svn>
DAV svn
SVNParentPath /home/svndata (此處配置你的版本庫根目錄)
AuthType Basic (連接類型設置 基本驗證)
AuthName "Subversion" (此處字符串內容修改爲提示對話框標題)
AuthUserFile /home/svndata/passwd(此處爲訪問版本庫用戶的文件,用apache的htpasswd命令生成)
AuthzSVNAccessFile /home/svndata/auth.conf(此處爲訪問版本庫權限的文件)
Require valid-user(在authfile中所有的用戶都可以訪問,如果沒有它,則只能第一個用戶可以訪問新建庫)
</Location>
保存退出。
重新啓動apache
#/usr/local/apache/bin/httpd –k restart
6、 配置svn權限管理
1) 添加用戶
# /usr/local/apache/bin/htpasswd -c /home/svndata/passwd user1
第一次設置用戶時使用-c 表示新建一個用戶文件。回車後輸入用戶密碼,完成對用戶的增加。第二次添加用戶不需要帶-c參數。如:
/usr/local/apache/bin/htpasswd /home/svndata/passwd user2
2) 權限分配:
# vi /home/svndata/auth.conf
[groups]表示羣組設置
Admin=user1,user2 表示admin羣組裏的成員
Develop=u1,u2 表示Develop羣組裏的成員
[www:/] 表示倉庫www的根目錄下的訪問權限
user1=rw www倉庫user1用戶具有讀和寫權限
user2=r www倉庫user2用戶具有讀權限
@develop=rw 羣develop的成員具有讀寫權限
[/] 在所有倉庫的根目錄下
*=r 對所有的用戶都具有讀寫權限
注意:在編輯auth.conf文件時,所有行都必須要頂頭寫,不能有縮行出現,否則會報錯。在auth.conf中也可以指定多個倉庫。若一個倉庫中有多個目錄,也可以設定某些用戶或組對該目錄有某些權限。如:
7、 配置svn鉤子
# mkdir -p /opt/test
# cd /home/svndata/www/hooks/
# cp post-commit.tmpl post-commit
# chown apache:apache post-commit
# chmod 755 post-commit
#vi post-commit
添加:
export LANG=zh_CN.UTF-8
/usr/local/svn/bin/svn update /opt/test --username=user1 --password=password --no-auth-cache(一定要加此參數!)
/usr/local/svn/bin/svn export http://192.168.254.131:80/svn/www/ /opt/test --username=user1 --password=password --force --no-auth-cache
啓動svn
#/usr/local/svn/bin/svnserve –d –r /home/svndata
-d 表示以daemon方式(後臺運行)運行
-r 指定根目錄
#ps –ef | grep svnserve
出現上面的表示啓動成功
啓動apache:
#/usr/local/apache/bin/httpd -k restart
#/usr/local/svn/bin/svn checkout http://192.168.254.131:80/svn/www/ /opt/test --username=ting --password=ting --no-auth-cache
#chown -R apache.apache /opt/test/
接下來客戶端TortoiseSVN測試
如圖客戶端連接
最後瀏覽器測試
http://192.168.254.131/svn/www
成功!到此apache svn 服務器的架設已經完成。
FAQ
1、權限錯誤:
如果出現Svn提交失敗,可根據失敗的具體提示去google,一般都能查出大概的錯誤原因,然後依次排查。例如:hooks腳本沒有執行權限,就需要加入執行權限並修改其屬主和屬組。
chown –R apache.apache /home/svndata/www/hooks/post-commit
chmod 755 /home/svndata/www/hooks/post-commit
PS:我們這次出現錯誤的主要原因是svn checkout時是以root用戶的身份,所以/opt/test目錄的屬主和屬組是root用戶。apache用戶沒有相關執行權限。
解決辦法:
chown –R apache.apache /opt/test
chmod –R 755 /opt/test
如果再不報錯的情況下達不到預期的效果,就要添加相關日誌來輔助分析問題。如此次搭建中,客戶端沒有任何錯誤產生,但是就是達不到預期的效果。我們加入瞭如下日誌:
LOG=/home/svndata/hook.log
/usr/local/svn/bin/svn update /opt/test --username=user1 --password=password --no-auth-cache(一定要加此參數!) >>$LOG
/usr/local/svn/bin/svn export http://192.168.254.131:80/svn/www/ /opt/test --username=user1 --password=password --force --no-auth-cache >>$LOG