一、什么是 Subversion?
為濱江等地區(qū)用戶提供了全套網(wǎng)頁設(shè)計(jì)制作服務(wù),及濱江網(wǎng)站建設(shè)行業(yè)解決方案。主營(yíng)業(yè)務(wù)為成都網(wǎng)站設(shè)計(jì)、做網(wǎng)站、濱江網(wǎng)站設(shè)計(jì),以傳統(tǒng)方式定制建設(shè)網(wǎng)站,并提供域名空間備案等一條龍服務(wù),秉承以專業(yè)、用心的態(tài)度為用戶提供真誠(chéng)的服務(wù)。我們深信只要達(dá)到每一位用戶的要求,就會(huì)得到認(rèn)可,從而選擇與我們長(zhǎng)期合作。這樣,我們也可以走得更遠(yuǎn)!
(本文永久地址:http://woymk.blog.51cto.com/10000269/1951937)
Subversion 是一個(gè)免費(fèi)/開源的版本控制系統(tǒng)(version control system, VCS), 也就是說, Subversion 可以跨越時(shí)間地對(duì)文件和目錄, 以及它們的修改進(jìn)行管理. 這就允許你恢復(fù)數(shù)據(jù)的舊版本, 或檢查數(shù)據(jù)的修改歷史. 由于這個(gè)特點(diǎn), 很多人把版本控制系統(tǒng)看成是一種“時(shí)間機(jī)器”。
Subversion 可以跨越網(wǎng)絡(luò)進(jìn)行操作, 這就允許多個(gè)用戶在不同的機(jī)器上工作. 從某種程度上講, 允許用戶在各自的空間里修改和管理同一組數(shù)據(jù)可以促進(jìn)團(tuán)隊(duì)協(xié)作, 因?yàn)樾薷牟辉偈菃尉€進(jìn)行, 開發(fā)速度會(huì)更快. 由于所有的工作都被記錄在案, 也就不用擔(dān)心并行開發(fā)會(huì)降低軟件的質(zhì)量—如果出現(xiàn)不正確的修改, 只要撤消那一次更改操作即可。
某些版本控制系統(tǒng)同時(shí)也是軟件配置管理 (software configuration management, SCM) 系統(tǒng). 這種系統(tǒng)經(jīng)過精巧的設(shè)計(jì), 專門用于管理源代碼樹, 具備許多與軟件開發(fā)有關(guān)的特性—理解編程語言, 提供了程序構(gòu)建工具. 但 Subversion 不是 SCM, 它是一個(gè)通用系統(tǒng), 可以管理任意類型的文件集合. 對(duì)你來說, 這些文件可能是源代碼文件—對(duì)別人來說, 可能是一個(gè)貨物清單或數(shù)字電影。
二、Subversion 的架構(gòu)
圖中的一端是存放所有版本數(shù)據(jù)的 Subversion 倉(cāng)庫(kù), 另一端是 Subversion 客戶端程序, 客戶端程序管理著部分版本數(shù)據(jù)在本地的映射. 兩端之間是穿過倉(cāng)庫(kù)訪問 (Repository Access) 層的多條訪問路徑, 其中一些路徑跨越計(jì)算機(jī)網(wǎng)絡(luò), 通過網(wǎng)絡(luò)服務(wù)器對(duì)倉(cāng)庫(kù)進(jìn)行訪問, 其他一些路徑則不經(jīng)過網(wǎng)絡(luò), 直接訪問倉(cāng)庫(kù).
三、Subversion 的組件
svn
客戶端命令行工具
svnversion
用于報(bào)告工作副本狀態(tài) (就項(xiàng)目的版本號(hào)而言) 的工具
svnlook
可以直接檢查倉(cāng)庫(kù)的工具
svnadmin
用于創(chuàng)建, 調(diào)整或修復(fù) Subversion 倉(cāng)庫(kù)的工具
mod_dav_svn
Apache HTTP 服務(wù)器插件, 該插件允許用戶通過網(wǎng)絡(luò)訪問倉(cāng)庫(kù)
svnserve
一個(gè)定制的, 可獨(dú)立運(yùn)行的服務(wù)器程序, 可以以守護(hù)進(jìn)程方式運(yùn)行, 也可以被 SSH 調(diào)用, 這是另一種允許用戶通過網(wǎng)絡(luò)訪問倉(cāng)庫(kù)的方法
svndumpfilter
過濾 Subversion 倉(cāng)庫(kù)轉(zhuǎn)儲(chǔ)數(shù)據(jù)流的程序
svnsync
可以跨越網(wǎng)絡(luò)對(duì)倉(cāng)庫(kù)進(jìn)行增量鏡像備份的程序
svnrdump
可以跨越網(wǎng)絡(luò)對(duì)倉(cāng)庫(kù)歷史進(jìn)行轉(zhuǎn)儲(chǔ)和加載的程序
svnmucc
該工具支持在沒有工作副本的情況下, 在一個(gè)單獨(dú)的提交中對(duì)多個(gè)倉(cāng)庫(kù)執(zhí)行基于 URL 的操作
四、安裝Subversion前的準(zhǔn)備
安裝一些常用的依賴包
yum install -y make gcc gcc-c++ perl zlib-devel libaio libpng libpng-devel libjpeg-devel pcre-devel
yum install -y libXpm-devel openssl openssl-devel libxml2-devel bzip2-devel.x86_64 libjpeg-turbo-devel
yum install -y freetype freetype-devel libtool cmake ncurses-devel bison re2c curl-devel wget
rpm -ivh "http://mirrors.sohu.com/fedora-epel/epel-release-latest-6.noarch.rpm"
yum install -y libmcrypt-devel re2c unzip
安裝Subversion需要的依賴包
(詳情可參考官方文檔:http://svn.apache.org/repos/asf/subversion/trunk/INSTALL)
1. Apache Portable Runtime 1.3 or newer
cd /usr/localhost/src
wget https://mirrors.tuna.tsinghua.edu.cn/apache/apr/apr-1.5.2.tar.gz
wget https://mirrors.tuna.tsinghua.edu.cn/apache/apr/apr-util-1.5.4.tar.gz
tar zxvf apr-1.5.2.tar.gz
cd apr-1.5.2
./configure --prefix=/usr/local/apr
make && make install
cd ..
tar zxvf apr-util-1.5.4.tar.gz
cd apr-util-1.5.4
./configure --prefix=/usr/local/apr --with-apr=/usr/local/apr
make && make install
2. Zlib
http://www.zlib.net/
下載的當(dāng)前版本為zlib-1.2.11.tar
解壓后執(zhí)行
./configure
make && make install
3. autoconf 2.59 or newer
yum install autoconf –y
4. libtool 1.4 or newer
yum install libtool -y
5. Apache Serf library 1.3.4 or newer
cd /usr/local/src
wget http://archive.apache.org/dist/serf/serf-1.2.1.tar.bz2
tar jxvf serf-1.2.1.tar.bz2
cd serf-1.2.1
yum install expat expat-devel –y
./configure --prefix=/usr/local/serf --with-apr=/usr/local/apr --with-apr-util=/usr/local/apr
make && make install
6. OpenSSL (OPTIONAL)
yum install openssl –y
7. Berkeley DB 4.X (可選安裝)
yuminstall db4 -y
8. Cyrus SASL library (OPTIONAL)
yum -y install cyrus-sasl*
9. dbus
yum install dbus
10. Qt 4 (可選安裝)
yum install qt qt-devel
11. GLib 2 (Unix only, OPTIONAL)
yum install glib2 glib2-devel
12. KDELibs 4 (可選安裝)
yum install kdelibs kdelibs-devel
13. Python 2.7 or newer (https://www.python.org/)
(可選擇安裝)
14. SQLite (REQUIRED)
https://www.sqlite.org/download.html
cd /usr/local/src
wget http://www.sqlite.org/2017/sqlite-amalgamation-3180000.zip
unzip sqlite-amalgamation-3180000.zip
先解壓好,后面安裝Subversion時(shí)要用到
五、安裝Apache Web Server(2.2.X or newer)
下載源碼包
cd /usr/local/src
wget http://mirrors.sohu.com/apache/httpd-2.2.34.tar.gz
tar zxvf httpd-2.2.34.tar.gz
編譯&&安裝
cd httpd-2.2.34
./configure --prefix=/webapp/apache2 --enable-dav --enable-dav-fs--enable-dav-lock --enable-so --enable-rewrite --enable-modules=all --enable-mods-shared=all --with-mpm=prefork --enable-maintainer-mode --enable-ssl --with-ssl --with-pcre --with-include-apr
make && make install
配置apache
cd /webapp/apache2/
vi conf/httpd.conf
找到
#ServerName www.example.com:80
改成
ServerName localhost:80
檢查配置文件語法
bin/apachectl -t
配置啟動(dòng)腳本
cp /usr/local/src/httpd-2.2.34/build/rpm/httpd.init/etc/init.d/httpd
注意文件中有三處主要的地方需要修改下的:
httpd=${HTTPD-/webapp/apache2/bin/httpd}
pidfile=${PIDFILE-/webapp/apache2/logs/${prog}.pid}
CONFFILE=/webapp/apache2/conf/httpd.conf
請(qǐng)根據(jù)自己的安裝目錄更改相應(yīng)的路徑!
然后運(yùn)行如下命令:
chmod +x /etc/init.d/httpd
chkconfig --add httpd
chkconfig httpd on
/etc/init.d/httpd start
netstat -lnp |grep httpd
六、安裝Subversion
官網(wǎng)下載地址:http://subversion.apache.org/download.cgi
這里我們下載1.8版
cd /usr/local/src
wget http://mirrors.tuna.tsinghua.edu.cn/apache/subversion/subversion-1.8.18.tar.gz
tar zxvf subversion-1.8.18.tar.gz
把解壓好的SQLite復(fù)制到subversion目錄下
mv sqlite-amalgamation-3180000subversion-1.8.18/sqlite-amalgamation
cd subversion-1.8.18
./configure --prefix=/webapp/subversion --with-apr=/usr/local/apr --with-apr-util=/usr/local/apr --enable-mod-activation --with-apache-libexecdir=/webapp/apache2/modules --with-apxs=/webapp/apache2/bin/apxs --with-serf=/usr/local/serf --with-zlib
make && make install
創(chuàng)建版本庫(kù):
要?jiǎng)?chuàng)建一個(gè)版本庫(kù),首先要確定采用哪種數(shù)據(jù)存儲(chǔ)方式。在 Subversion 中,版本庫(kù)的數(shù)據(jù)存儲(chǔ)有兩種方式,一種是在 Berkeley DB 數(shù)據(jù)庫(kù)中存放數(shù)據(jù);另一種是使用普通文件,采用自定義的格式來儲(chǔ)存,稱為 FSFS。
兩種版本庫(kù)數(shù)據(jù)存儲(chǔ)對(duì)照表
特性 | Berkeley DB | FSFS |
---|---|---|
對(duì)操作中斷的敏感 | 很敏感;系統(tǒng)崩潰或者權(quán)限問題會(huì)導(dǎo)致數(shù)據(jù)庫(kù)“塞住”,需要定期進(jìn)行恢復(fù)。 | 不敏感。 |
可只讀加載 | 不能 | 可以 |
存儲(chǔ)平臺(tái)無關(guān) | 不能 | 可以 |
可從網(wǎng)絡(luò)文件系統(tǒng)訪問 | 不能 | 可以 |
版本庫(kù)大小 | 稍大 | 稍小 |
可擴(kuò)展性:修訂版本樹的數(shù)量 | 數(shù)據(jù)庫(kù),沒有限制 | 許多古老的本地文件系統(tǒng)在處理單一目錄包含上千個(gè)條目時(shí)出現(xiàn)問題。 |
可擴(kuò)展性:文件較多的目錄 | 較慢 | 較快 |
速度:檢出最新的代碼 | 較快 | 較慢 |
速度: 大的提交 | 較慢,但是時(shí)間被分配在整個(gè)提交操作中 | 較快,但是最后較長(zhǎng)的延時(shí)可能會(huì)導(dǎo)致客戶端操作超時(shí) |
組訪問權(quán)處理 | 對(duì)于用戶的umask設(shè)置十分敏感,最好只由一個(gè)用戶訪問。 | 對(duì)umask設(shè)置不敏感 |
功能成熟時(shí)間 | 2001年開始使用 | 2004年開始使用 |
確定了具體的數(shù)據(jù)存儲(chǔ)類型,只要在命令行當(dāng)中執(zhí)行 svnadmin 命令就可以創(chuàng)建一個(gè) Subversion 版本庫(kù),命令如下:
創(chuàng)建文件夾
mkdir /webapp/svndata
PATH=$PATH:/webapp/subversion/bin
執(zhí)行svnadmin命令創(chuàng)建版本庫(kù),指定數(shù)據(jù)存儲(chǔ)為FSFS
svnadmin create --fs-type fsfs /webapp/svndata/data
如果要指定為Berkeley DB,則將fsfs替換為bdb
對(duì)于Subversion 1.2以后版本,svnadmin缺省使用fsfs文件系統(tǒng)后端創(chuàng)建版本庫(kù)。
ll /webapp/svndata/data/
總用量 24
drwxr-xr-x. 2 root root 4096 7月 28 07:29 conf
drwxr-sr-x. 6 root root 4096 7月 28 07:29 db
-r--r--r--. 1 root root 2 7月 28 07:29 format
drwxr-xr-x. 2 root root 4096 7月 28 07:29 hooks
drwxr-xr-x. 2 root root 4096 7月 28 07:29 locks
-rw-r--r--. 1 root root 246 7月 28 07:29 README.txt
conf 目錄下存放了版本庫(kù)的配置文件,包括用戶訪問控制和權(quán)限控制等內(nèi)容;
db 目錄下存放著 Subversion 所要管理的所有受版本控制的數(shù)據(jù);
hooks 目錄存放著鉤子腳本及其模版(一種版本庫(kù)事件觸發(fā)程序);
locks 目錄存放著 Subversion 版本庫(kù)鎖定數(shù)據(jù);
format 文件記錄了版本庫(kù)的布局版本號(hào)。
用 svn import 命令來進(jìn)行項(xiàng)目的導(dǎo)入:
svn import /tmp/ file:///webapp/svndata/data/ --message "init"
確認(rèn)導(dǎo)入的項(xiàng)目是否正確:
svn list --verbose file:///webapp/svndata/data/
查看最新修訂版本的信息:
svnlook info /webapp/svndata/data
"--revision 版本號(hào)",指定某一個(gè)修訂版的顯示:
svnlook info /webapp/svndata/data --revision1
顯示版本庫(kù)的具體樹形結(jié)構(gòu),后面的“--show-ids”選項(xiàng)指定顯示每一個(gè)顯示元素的修改版本 ID:
svnlook tree /webapp/svndata/data/ --show-ids
基本的服務(wù)器配置
svnserve 是一個(gè)輕量級(jí)的服務(wù)器, 使用自定義的協(xié)議通過TCP/IP與客戶端通訊。客戶端通過由 svn:// 或者 svn+ssh:// 開始的URL訪問svnserve服務(wù)器。
啟動(dòng)SVN服務(wù)器:
svnserve –d -r /webapp/svndata
-i作為 inetd 啟動(dòng)
-d做為守護(hù)進(jìn)程啟
-r用來指定版本庫(kù)的根路徑
在客戶端使用 TortoiseSVN 可以通過如下形式訪問服務(wù)器:
svn://服務(wù)器IP/data
版本庫(kù)的 conf 子文件夾下的配置文件說明:
1.svnserve.conf
[general]
# anon-access = read #匿名用戶的權(quán)限
# auth-access = write #認(rèn)證用戶的權(quán)限
password-db = passwd #指定密碼文件
# authz-db = authz #權(quán)限控制文件
# realm = My First Repository
2.passwd文件的配置及說明
[users]
# harry = harryssecret
# sally = sallyssecret
等號(hào)前面是用戶名,后面是密碼,密碼是明文的。更改svnserve.conf的時(shí)候,需要重啟SVN,更改authz,passwd文件,不需重啟。
3.a(chǎn)uthz文件的配置及說明
[groups]
# harry_and_sally = harry,sally
groups定義的變量就是組名,1個(gè)用戶組可以包含1個(gè)或者多個(gè)用戶,逗號(hào)分隔,上例中harry_and_sally就是一個(gè)組
版本庫(kù)目錄格式:
[<版本庫(kù)>:/項(xiàng)目/目錄]
@<用戶組名> = <權(quán)限>
<用戶名> = <權(quán)限>
其中,方框號(hào)內(nèi)部可以有多種寫法:
[/],表示根目錄及以下,根目錄是svnserve啟動(dòng)時(shí)指定的,這里配置的是/webapp/svndata/,[/]就是表示對(duì)全部版本庫(kù)設(shè)置權(quán)限。
[data:/],表示對(duì)版本庫(kù)data設(shè)置權(quán)限
[date:/test],表示對(duì)版本庫(kù)data中的test項(xiàng)目設(shè)置權(quán)限
[data:/test/aaa],表示對(duì)版本庫(kù)data中test項(xiàng)目的aaa目錄設(shè)置權(quán)限
權(quán)限主體可以是用戶組、用戶或*,用戶組在前面加@,*表示全部用戶。
權(quán)限可以是w、r、rw、和空,空表示沒有任何權(quán)限。
authz中每個(gè)參數(shù)都要頂格寫,開頭不能有空格。
[/]
Kevin = rw
@harry_and_sally = r
注意:權(quán)限配置文件中出現(xiàn)的用戶名必須已在用戶配置文件中定義
設(shè)置passwd,authz文件權(quán)限
chmod 600 conf/{passwd,authz} #非必須,最好改下
4. Checkout注意事項(xiàng)
在windows上安裝客戶端TortoiseSVN之后,checkout版本的時(shí)候有個(gè)地方需要注意。
例如如果創(chuàng)建項(xiàng)目版本庫(kù)的命令為 # svnadmin create /svn/testversion1/
啟動(dòng)svn服務(wù)的命令 # svnserve -d -r /svn/
那么在客戶端檢出該版本庫(kù)的URL為:svn://xx.xx.xx.xx/testversion1/
如果啟動(dòng)svn服務(wù)的命令為 svnserve -d -r /svn/testversion1/,那么檢出的URL則為:svn://xx.xx.xx.xx/
七、與 Apache Http Server 的結(jié)合
通過 Http 協(xié)議訪問版本庫(kù)是 Subversion 的亮點(diǎn)之一。使用 Http 協(xié)議意味著只需要打開瀏覽器,輸入 URL 即可輕松的瀏覽整個(gè)版本庫(kù)。靈活通常帶來復(fù)雜性,Http 方式相對(duì)于 svnserve 方式來說需要更多的配置。
配置apache
為了使 Subversion 與 dav 模塊通信,需要安裝 mod_dav_svn 插件,在Apache的 httpd.conf 文件中加入以下內(nèi)容:
LoadModule dav_module modules/mod_dav.so
LoadModule dav_svn_module modules/mod_dav_svn.so
DAV svn
SVNPath /webapp/svndata/data
重啟apache
/etc/init.d/httpd restart
瀏覽器輸入“http://服務(wù)器IP/data”
顯示:
data- Revision 1: /
這表示mod_dav_svn模塊工作正常,如果無法顯示,請(qǐng)檢查防火墻和SELinx的配置
可以先臨時(shí)關(guān)閉防火墻和SELinx(生產(chǎn)環(huán)境請(qǐng)按實(shí)際情況配置)
iptables –F
setenforce 0
可以使用 SVNParentPath 代替SVNPath,
SVNParentPath /webapp/svndate表示/webapp/svndata下的每個(gè)子目錄都是一個(gè)版本庫(kù),可以通過:
http://服務(wù)器IP/svndata/data1
http://服務(wù)器IP/svndata/data2
|
|
|
http://服務(wù)器IP/svndata/data10
來訪問。
權(quán)限設(shè)置:
1. Apache基本權(quán)限設(shè)置
最簡(jiǎn)單的客戶端認(rèn)證方式是通過HTTP基本認(rèn)證機(jī)制,簡(jiǎn)單的使用用戶名和密碼來驗(yàn)證一個(gè)用戶所自稱的身份,Apache提供了一個(gè)htpasswd工具來管理可接受的用戶名和密碼 。
cd /webapp
apache2/bin/htpasswd -c svndata/passwd user1
-c 表示新建一個(gè)密碼文件
vi apache2/conf/httpd.conf
在 Location 標(biāo)簽中加入以下內(nèi)容:
AuthType Basic
AuthName "svn data"
AuthUserFile /webapp/svndata/passwd
Require valid-user
保存后,重啟apache后即可
/etc/init.d/httpd restart
可以把"Require valid-user" 替換為"Require user harry sally",表示只有harry和sally可以訪問該版本庫(kù)。
2. 用 mod_authz_svn 進(jìn)行目錄訪問控制
使用mod_authz_svn模塊可以更加細(xì)致的設(shè)置訪問權(quán)限。
vi apache2/conf/httpd.conf
查看mod_auth_svn 模塊是否加載
LoadModule authz_svn_modulemodules/mod_authz_svn.so
增加以下內(nèi)容
DAV svn
SVNParentPath /webapp/svndata
AuthType Basic
AuthName "svn data"
AuthUserFile /webapp/svndata/passwd
AuthzSVNAccessFile /webapp/svndata/accesspolicy
Satisfy Any
Require valid-user
AuthzSVNAccessFile 指向的是 authz 的策略文件,詳細(xì)的權(quán)限控制可以在這個(gè)策略文件中指定,如:
#兩個(gè)分組:group1,group2 [groups] group1 = user1, user2 group2 = user3, user4 #在根目錄下指定所有的用戶有讀權(quán)限 [/] * = r #追加group1組用戶有讀寫權(quán)限 @group1= rw #在data下給予用戶user1讀寫權(quán)限 [data:/] user1 = rw #禁止所有用戶訪問 /private 目錄 [/private] * = #給group2組用戶讀權(quán)限 @group2= r
如果要對(duì)具體每個(gè)版本庫(kù)配置,用如下的語法:
[groups] project1 = user1, user2 project2 = user3 ,user4 [data1:/] * = r @ project1 = rw [data2:/] * = r @ project2 = rw
這樣項(xiàng)目1的project1組只能對(duì) data1 版本庫(kù)下的文件具有寫權(quán)限而不能修改版本庫(kù)data2,同樣項(xiàng)目2的project2組也不能修改data1 版本庫(kù)的文件。
修改完配置后記得保存重啟apache:
/etc/init.d/httpd restart
另外還要修改對(duì)應(yīng)目錄的權(quán)限,讓它們支持apache運(yùn)行帳號(hào)可寫
chown -R daemon:daemon /webapp/svndata/data
這個(gè)帳號(hào)可在apache配置文件httpd.conf中設(shè)置:
User daemon
Group daemon
八、測(cè)試
SVN服務(wù)器安裝配置完畢,在客戶端使用TortoiseSVN進(jìn)行測(cè)試,結(jié)果如下:
根據(jù)提示輸入用戶名和密碼