VN版本控制服務(wù)
SVN是Subversion的簡稱,是一個(gè)開放源代碼的版本控制系統(tǒng),相較于CVS,它采用了分支管理系統(tǒng),它的設(shè)計(jì)目標(biāo)就是取代CVS。互聯(lián)網(wǎng)上很多版本控制服務(wù)已從CVS遷移到Subversion。也是就是CVS的接班人!
CVS是一個(gè)C/S系統(tǒng),是一個(gè)常用的代碼版本控制軟件。主要在開源軟件管理中使用。與它相類似的代碼版本控制軟件有subversion。多個(gè)開發(fā)人員通過一個(gè)中心版本控制系統(tǒng)來記錄文件版本,從而達(dá)到保證文件同步的目的。CVS版本控制系統(tǒng)是一種GNU軟件包,主要用于在多人開發(fā)環(huán)境下的源碼的維護(hù)。但是由于之前CVS編碼的問題,現(xiàn)在大多數(shù)軟件開發(fā)公司都使用SVN替代了CVS。
官方網(wǎng)站:http://subversion.apache.org/
Windows客戶端 TortoiseSVN:http://tortoisesvn.net/
常見的版本控制軟件
CVS,逐漸被SVN取代,是CVX重寫版和改寫版
SVN,Subversion
Git,Git是一個(gè)開源的分布式版本控制系統(tǒng),用以有效、高速的處理從很小到非常大的項(xiàng)目版本管理。Git 是 Linus Torvalds 為了幫助管理 Linux 內(nèi)核開發(fā)而開發(fā)的一個(gè)開放源碼的版本控制軟件
SVN存儲數(shù)據(jù)的方式
BDB,Berkeley DB,一種事務(wù)安全型表類型
FSFS,"FSFS" 采用文件系統(tǒng)的方式, 替代原來的基于Berkeley DB的實(shí)現(xiàn).
因?yàn)锽DB方式在服務(wù)器中斷時(shí),有可能鎖住數(shù)據(jù),所以還是FSFS方式更安全一點(diǎn)。
SVN的運(yùn)行方式及端口
獨(dú)立服務(wù)器 3690端口 訪問方式SVN:// C/S模式
借助apache運(yùn)行 80端口 訪問方式 http://
工作流程
集中式代碼管理的核心是服務(wù)器,所有開發(fā)者在開始新一天的工作之前必須從服務(wù)器獲取代碼,然后開發(fā),最后解決沖突,提交。所有的版本信息都放在服務(wù)器上。如果脫離了服務(wù)器,開發(fā)者基本上可以說是無法工作的。下面舉例說明:開始新一天的工作:
1、從服務(wù)器下載項(xiàng)目組最新代碼。
2、進(jìn)入自己的分支,進(jìn)行工作,每隔一個(gè)小時(shí)向服務(wù)器自己的分支提交一次代碼
(很多人都有這個(gè)習(xí)慣。因?yàn)橛袝r(shí)候自己對代碼改來改去,最后又想還原到前一個(gè)小時(shí)的版本,或者看看前一個(gè)小時(shí)自己修改了哪些代碼,就需要這樣做了)。
3、下班時(shí)間快到了,把自己的分支合并到服務(wù)器主分支上,一天的工作完成,并反映給服務(wù)器。
這就是經(jīng)典的svn工作流程,從流程上看,有不少缺點(diǎn),但也有優(yōu)點(diǎn)。
SVN+Apache運(yùn)行原理
SVN搭配Apache的時(shí)候,Apache需要使用mod_dav_svn這個(gè)模塊,他的運(yùn)行機(jī)制如下:
在一臺服務(wù)器上建立一個(gè)源代碼庫,庫里可以存放許多不同項(xiàng)目的源程序。有源代碼庫管理員統(tǒng)一管理這些源程序。
每個(gè)用戶在使用源代碼庫之前,首先要把源代碼庫里德項(xiàng)目文件下載到本地,然后開發(fā)人員可以在本地修改,左后用svn命令進(jìn)行提交,由源代碼庫統(tǒng)一管理修改。
mod_dav_svn 可以讓版本庫通過http協(xié)議實(shí)現(xiàn)網(wǎng)站展現(xiàn)
構(gòu)建SVN版本控制服務(wù)器
SVN+HTTP Server (XueGod63)==========Client Server(XueGod64)
檢查是否已安裝
rpm -qa subversion
如果要卸載舊版本
yum remove subversion
軟件安裝
#包括HTTP所需模塊一起裝(httpd mod_auth_mysql 是安裝配合Apache的模塊,你可以只裝subversion,多裝了也無所謂) [root@XueGod63 ~]# yum install -y subversion httpd mod_dav_svn #查看已注冊 [root@XueGod63 ~]# cat /etc/services | grep --color svn
svn 3690/tcp # Subversion
svn 3690/udp # Subversion
創(chuàng)建版本庫目錄
#存放版本庫的主目錄 [root@XueGod63 ~]# mkdir /www/svn/ #創(chuàng)建項(xiàng)目 #svnadmin命令是由subversion這個(gè)軟件包提供的 [root@XueGod63 ~]# svnadmin create /www/svn/test_project #隨便查看一個(gè)版本庫 [root@XueGod63 ~]# ls /www/svn/test_project
conf db format hooks locks README.txt
dav目錄:是提供apache與mod_dav_svn使用的目錄,讓他們存儲內(nèi)部數(shù)據(jù),剛開始新建時(shí)此目錄沒有
db目錄:就是所有版本控制的數(shù)據(jù)存放文件
hooks目錄:放置hook腳本文件的目錄
locks目錄:用來放置subversion監(jiān)控鎖定數(shù)據(jù)的目錄,用來追蹤存取文件庫的客戶端
format文件:是一個(gè)文本文件,里面只放了一個(gè)整數(shù)。表示當(dāng)前文件庫配置的版本號
conf目錄:是這個(gè)倉庫的配置文件(倉庫的用戶訪問賬號、權(quán)限等),也是我們要關(guān)注的配置文件
[root@XueGod63 ~]# ls /www/svn/test_project/conf/
authz passwd svnserve.conf
authz #認(rèn)證權(quán)限相關(guān)
passwd #用戶名和密碼
svnserve.conf #服務(wù)器配置文件
針對不同版本庫修改配置文件
接下來的一段用于配置使用哪種授權(quán)登錄方式;
#修改xuegod.cn的配置文件 [root@XueGod63 ~]# vim /www/svn/test_project/conf/svnserve.conf
[general]
anon-access = none #對于匿名用戶,無訪問權(quán)限,這里必須為none,因?yàn)橹挥性O(shè)為none,在客戶端才能看到每次提交的備注信息
auth-access = write #對于授權(quán)用戶,有寫權(quán)限,可以是read,write,none
#password-db = passwd #用戶名和密碼都是明文存放在同級目錄下的passwd文件中;優(yōu)點(diǎn)是高效配置簡單,缺點(diǎn)是安全性弱,明文總不是那么讓人感覺可靠
authz-db = authz #認(rèn)證權(quán)限文件,取消注釋即可
realm = test_project #指定授權(quán)所屬的域,PHP的同志可將其理解為名字空間;
#接下來是[sasl]段,用于標(biāo)識是否進(jìn)行SASL加密處理;
use-sasl=true
min-encryption=128
max-encryption=256
#變量 min-encryption 和 max-encryption 控制服務(wù)器所需要的加密強(qiáng)度。
注意:此配置文件的所有內(nèi)容必須頂格,否則會報(bào)錯(cuò)
配置用戶和密碼及認(rèn)證權(quán)限
#設(shè)置用戶名和密碼 [root@XueGod63 ~]# vim /www/svn/test_project/conf/passwd
[users]
Find = 123456
HA = 123456
user = 123456
#末尾添加上面三行
#對于部分版本,前面的[users]是有#號的,如果有#號,一定要取消,否則只能使用匿名用戶登錄,客戶端登錄不會
出現(xiàn)登錄窗口或密碼提示,除非在配置文件將anon設(shè)置為none,否則將返回一個(gè)錯(cuò)誤
#這里的密碼都是明文,沒有加密
#設(shè)置用戶和組的權(quán)限 [root@XueGod63 ~]# vim /www/svn/test_project/conf/authz
[groups] #此行默認(rèn)存在了
test_group=Find,HA #定義組,在[groups]下面添加
#用戶組格式 用戶組名=用戶1,用戶2
#一個(gè)組可以包含多個(gè)用戶,英文逗號間隔,用戶名必須是在passwd中存在的
[test_project:/] #/表示我當(dāng)前所在版本庫目錄,這里代表test_project
@test_group = rw #@test_group表示這個(gè)組的權(quán)限,就是上面定義的組的成員
* = #除了上面的有賦予權(quán)限成員之外,其他的成員都沒有權(quán)限
SVN目錄格式:
[/目錄名]
@用戶組名 = 權(quán)限
用戶名 = 權(quán)限
* =
SVN使用SASL加密
1.配置svnserve.conf,注釋掉password-db=passwd
并啟用sqsl:use-sasl=true
2.新建一個(gè)svn.conf文件,一般放在/usr/lib/sasl2或者/etc/sasl2,內(nèi)容為:
pwcheck_method: auxprop
auxprop_plugin: sasldb
sasldb_path: /home/svnadmin/config/sasldb
mech_list: DIGEST-MD5
其中sasldb_path 指定你打算將sasl加密的數(shù)據(jù)庫放置的位置;
注釋:pwcheck_method指明檢查的方法,這里是“auxprop ”,這個(gè)pwcheck_method還對應(yīng)了如啟動(dòng)一個(gè)代理作為認(rèn)證服務(wù)等方式,而現(xiàn)在的意思就是使用本文件說的方式去檢查。然后我們指明auxprop_plugin為sasldb,也就是使用一個(gè)文件存放用戶名密碼,也就是/www/svn/test_project/sasldb,其它的認(rèn)證信息存放plugin還有sql和ldapdb。而mech_list指明了認(rèn)證信息傳遞機(jī)制。
svnserve 已經(jīng)在運(yùn)行,你需要重啟服務(wù),并確保它讀取了更新后的配置參數(shù)
killall svnserve //停止svnserve服務(wù)
svnserve –d –r /www/svn //啟動(dòng)svnserve服務(wù)
3.創(chuàng)建用戶和密碼
使用saslpasswd2 程序
語法:saslpasswd2 –c –f /www/svn/test_project/sasldb –u [svnserve.conf里面配置的realm名字] [username]
eg:saslpasswd2 -c -f /home/svnadmin/config/sasldb -u examPro colin
會出現(xiàn)交互界面,提示輸入兩次密碼;
附:
saslpasswd2 -d -f home/svnadmin/config/sasldb -u 用戶名//刪除用戶
sasldblistusers2 -f /home/svnadmin/config/sasldb // 查詢用戶
PS:如果訪問庫的時(shí)候出現(xiàn)以下提示 "Could not obtain the list of SASL mechanisms",原因是Linux默認(rèn)沒有安裝DIGEST-MD5,此時(shí),可用以下命令安裝更新:yum install cyrus-sasl-md5 , cyrus-sasl-md5首頁:http://asg.web.cmu.edu/sasl/, 安裝包下載地址:ftp://ftp.andrew.cmu.edu/pub/cyrus/
配置完成。
服務(wù)SVN啟動(dòng)及創(chuàng)建測試代碼
#啟動(dòng)了所有版本庫,如果只需要某一個(gè)版本庫, #在-r后面添加/www/svn/test_project/的版本庫即可 -d=daemon -r=root of directory of save指定根目錄 [root@XueGod63 ~]# svnserve -d -r /www/svn/ #查詢到下面這行內(nèi)容就可以了 [root@XueGod63 ~]# ps -aux | grep svn
root 17107 0.0 0.0 199020 1028 ? Ss 23:30 0:00 svnserve -d -r /www/svn/
root 17446 0.0 0.0 110228 892 pts/0 S+ 23:32 0:00 grep --color=auto svn
[root@XueGod63 ~]# netstat -antup | grep svn
服務(wù)正常
tcp 0 0 0.0.0.0:3690 0.0.0.0:* LISTEN 17107/svnserve
使用svn導(dǎo)入測試代碼
導(dǎo)入測試代碼格式: svn [選項(xiàng)] 源碼 svn://server ip/項(xiàng)目名
常見的選項(xiàng):
import:將未版本化的文件納入版本控制并提交 checkout:從版本庫中檢出一個(gè)修訂版 update:更新工作拷貝 add,delete,copy,move:增、刪、復(fù)制、移動(dòng)文件或目錄
status:檢查狀態(tài)差異 diff:檢查文件行級詳細(xì)差異
revert:恢復(fù) resolve:解決沖突
switch:切換工作拷貝對應(yīng)的版本庫分支 log:查看歷史記錄
list:顯示文件目錄 cat:查看某個(gè)文件內(nèi)容
開放svn端口
默認(rèn)是3690端口,你也可以用別的。已開啟的跳過這一步
vi /etc/sysconfig/iptables #修改 iptables -I INPUT -p tcp --dport 3690 -j ACCEPT #保存 service iptables save #重啟 service iptables restart #查看 /etc/init.d/iptables status
在網(wǎng)站根目錄建立SVN版本庫
為了避免每次都重新輸入SVN賬號密碼,可修改以下配置
[root@localhost public_html]# vim /root/.subversion/servers
把
# store-plaintext-passwords=no
改為
store-plaintext-passwords=yes
建立版本庫
#打開網(wǎng)站根目錄,我的根目錄是/www/web/test_com/public_html [root@XueGod63 ~]# cd /www/web/test_com/public_html #在網(wǎng)站根目錄建立版本庫,由于當(dāng)前已經(jīng)在網(wǎng)站根目錄,所以用 . 表示建立版本庫的目錄 #也可以使用絕對路徑 /www/web/test_com/public_html [root@XueGod63 ~]# svn checkout svn://192.168.1.2/test_project . #提示輸入SVN帳號和密碼,輸入以上設(shè)置的SVN帳號密碼即可
提交網(wǎng)站根目錄的源碼到SVN服務(wù)器
把網(wǎng)站的所有文件提交到SVN服務(wù)器
#把項(xiàng)目加入到SVN庫,并提交 [root@XueGod63 ~]# svn add app/ [root@XueGod63 ~]# svn add include/ [root@XueGod63 ~]# svn add template/ [root@XueGod63 ~]# svn add runtime/ [root@XueGod63 ~]# svn add index.php [root@XueGod63 ~]# svn commit -m "初次提交"
在開發(fā)環(huán)境(本地)檢出項(xiàng)目
在本地項(xiàng)目檢出SVN,SVN地址:svn://192.168.1.2/test_project
d:守護(hù)進(jìn)程
-r:svn根目錄
假設(shè)服務(wù)端IP為192.168.1.2,那么如下設(shè)置后test_project的訪問目錄就為:
svn://192.168.1.2/test_project
比如 帳號密碼為上面設(shè)置的Find = 123456,檢出。
SVN上傳時(shí)同步到服務(wù)器其它目錄
同步程序思路:用戶提交程序到SVN,SVN觸發(fā)hooks,按不同的hooks進(jìn)行處理,這里用到的是post-commit,利用post-commit到代碼檢出到SVN服務(wù)器的本地硬盤目錄,再通過rsync同步到遠(yuǎn)程的WEB服務(wù)器上。
知識點(diǎn):
1、SVN的hooks
# start-commit 提交前觸發(fā)事務(wù)
# pre-commit 提交完成前觸發(fā)事務(wù)
# post-commit 提交完成時(shí)觸發(fā)事務(wù)
# pre-revprop-change 版本屬性修改前觸發(fā)事務(wù)
# post-revprop-change 版本屬性修改后觸發(fā)事務(wù)
通過上面這些名稱編寫的腳本就就可以實(shí)現(xiàn)多種功能了,相當(dāng)強(qiáng)大。
2、同步命令rsync的具體參數(shù)使用
3、具有基個(gè)語言的編程能力bash python perl都可以實(shí)現(xiàn)
post-commit具體實(shí)現(xiàn)細(xì)節(jié)
post-commit腳本
能看到一堆模版鉤子文件,我們需要的是post-commit.tmpl,
copy一份,命名為post-commit。然后修改;
編輯文件:
sudo vim /www/svn/test_project/hooks/post-commit
注意:編輯完成post-commit后,給予可執(zhí)行權(quán)限:
sudo chmod -R 755 /www/svn/test_project/hooks/post-commit
內(nèi)容:
#!/bin/sh #設(shè)置語言環(huán)境 ##這行比較重要,需要根據(jù)你的服務(wù)器環(huán)境選擇正確的語言環(huán)境,否則,這個(gè)update不會工作 export.UTF-8 #設(shè)置SVN更新時(shí)需要同步更新的目錄,這里發(fā)現(xiàn)不加username和password也是可以的 #svn update /www/web/test_com/public_html --username yoursname --password yourpwd sudo svn update /www/web/test_com/public_html
這樣在本地SVN提交代碼后,服務(wù)器的代碼也會自動(dòng)從SVN更新。
注意:svn倉庫文件夾的other必須要有執(zhí)行權(quán)限不然腳本無法執(zhí)行。SVN update 之前一定要先手動(dòng)checkout一份出來,還有這里一定要添加用戶和密碼如果只是手動(dòng)一樣會更新,但自動(dòng)一樣的不行。
啟動(dòng)和停止SVN服務(wù)
啟動(dòng)SVN服務(wù)
svnserve -d -r /www/svn/
描述說明:
-d 表示svnserver以“守護(hù)”進(jìn)程模式運(yùn)行
-r 指定文件系統(tǒng)的根位置(版本庫的根目錄),這樣客戶端不用輸入全路徑,就可以訪問版本庫。
如果想監(jiān)聽其他端口,使用
svnserve -d -r /www/svn/ --listen-port 88
停止SVN服務(wù)
killall svnserve
設(shè)置開機(jī)自啟動(dòng)
安裝好的svn服務(wù)端,默認(rèn)是不會開機(jī)自啟動(dòng)的,每次開機(jī)自己啟動(dòng)會很麻煩,我們可以把它設(shè)成開機(jī)啟動(dòng)。
首先:編寫一個(gè)啟動(dòng)腳本svn_startup.sh,我放在/www/svn/svn_startup.sh
#!/bin/bash /usr/bin/svnserve -d -r /www/svn/ --listen-port 88
如果是部署為外網(wǎng),這里自定義了88端口,需要注意檢出地址需要加上自定義的端口號。(貌似自定義端口號后不能使用post-commit自動(dòng)提交了,會提示拒絕連接,還沒有找到使用自定義端口連接的方法)
這里的svnserve路徑保險(xiǎn)起見,最好寫絕對路徑,因?yàn)閱?dòng)的時(shí)候,環(huán)境變量也許沒加載。
絕對路徑怎么查?
which svnserve
這里還有可能碰到一個(gè)問題,如果你在windows下建立和編寫的腳步,拿到linux下,用vi或者vim修改后可能會無法執(zhí)行,這是文件格式的問題:
vi svn_startup.sh #輸入:set ff 回車 #如果顯示的結(jié)果不是fileformat=unix #再次輸入 set ff=unix #就OK了
然后修改該腳本的執(zhí)行權(quán)限:
chmod ug+x svn_startup.sh #或者萬能的 chmod 777 svn_startup.sh
最后,加入自動(dòng)運(yùn)行:
vi /etc/rc.d/rc.local #在末尾添加腳本的路徑,如: /www/svn/svn_startup.sh
現(xiàn)在,你可以重啟一下試試了。
ps -ef|grep svnserve
VN版本控制服務(wù)
SVN是Subversion的簡稱,是一個(gè)開放源代碼的版本控制系統(tǒng),相較于CVS,它采用了分支管理系統(tǒng),它的設(shè)計(jì)目標(biāo)就是取代CVS。互聯(lián)網(wǎng)上很多版本控制服務(wù)已從CVS遷移到Subversion。也是就是CVS的接班人!
CVS是一個(gè)C/S系統(tǒng),是一個(gè)常用的代碼版本控制軟件。主要在開源軟件管理中使用。與它相類似的代碼版本控制軟件有subversion。多個(gè)開發(fā)人員通過一個(gè)中心版本控制系統(tǒng)來記錄文件版本,從而達(dá)到保證文件同步的目的。CVS版本控制系統(tǒng)是一種GNU軟件包,主要用于在多人開發(fā)環(huán)境下的源碼的維護(hù)。但是由于之前CVS編碼的問題,現(xiàn)在大多數(shù)軟件開發(fā)公司都使用SVN替代了CVS。
官方網(wǎng)站:http://subversion.apache.org/
Windows客戶端 TortoiseSVN:http://tortoisesvn.net/
常見的版本控制軟件
CVS,逐漸被SVN取代,是CVX重寫版和改寫版
SVN,Subversion
Git,Git是一個(gè)開源的分布式版本控制系統(tǒng),用以有效、高速的處理從很小到非常大的項(xiàng)目版本管理。Git 是 Linus Torvalds 為了幫助管理 Linux 內(nèi)核開發(fā)而開發(fā)的一個(gè)開放源碼的版本控制軟件
SVN存儲數(shù)據(jù)的方式
BDB,Berkeley DB,一種事務(wù)安全型表類型
FSFS,"FSFS" 采用文件系統(tǒng)的方式, 替代原來的基于Berkeley DB的實(shí)現(xiàn).
因?yàn)锽DB方式在服務(wù)器中斷時(shí),有可能鎖住數(shù)據(jù),所以還是FSFS方式更安全一點(diǎn)。
SVN的運(yùn)行方式及端口
獨(dú)立服務(wù)器 3690端口 訪問方式SVN:// C/S模式
借助apache運(yùn)行 80端口 訪問方式 http://
工作流程
集中式代碼管理的核心是服務(wù)器,所有開發(fā)者在開始新一天的工作之前必須從服務(wù)器獲取代碼,然后開發(fā),最后解決沖突,提交。所有的版本信息都放在服務(wù)器上。如果脫離了服務(wù)器,開發(fā)者基本上可以說是無法工作的。下面舉例說明:開始新一天的工作:
1、從服務(wù)器下載項(xiàng)目組最新代碼。
2、進(jìn)入自己的分支,進(jìn)行工作,每隔一個(gè)小時(shí)向服務(wù)器自己的分支提交一次代碼
(很多人都有這個(gè)習(xí)慣。因?yàn)橛袝r(shí)候自己對代碼改來改去,最后又想還原到前一個(gè)小時(shí)的版本,或者看看前一個(gè)小時(shí)自己修改了哪些代碼,就需要這樣做了)。
3、下班時(shí)間快到了,把自己的分支合并到服務(wù)器主分支上,一天的工作完成,并反映給服務(wù)器。
這就是經(jīng)典的svn工作流程,從流程上看,有不少缺點(diǎn),但也有優(yōu)點(diǎn)。
SVN+Apache運(yùn)行原理
SVN搭配Apache的時(shí)候,Apache需要使用mod_dav_svn這個(gè)模塊,他的運(yùn)行機(jī)制如下:
在一臺服務(wù)器上建立一個(gè)源代碼庫,庫里可以存放許多不同項(xiàng)目的源程序。有源代碼庫管理員統(tǒng)一管理這些源程序。
每個(gè)用戶在使用源代碼庫之前,首先要把源代碼庫里德項(xiàng)目文件下載到本地,然后開發(fā)人員可以在本地修改,左后用svn命令進(jìn)行提交,由源代碼庫統(tǒng)一管理修改。
mod_dav_svn 可以讓版本庫通過http協(xié)議實(shí)現(xiàn)網(wǎng)站展現(xiàn)
構(gòu)建SVN版本控制服務(wù)器
SVN+HTTP Server (XueGod63)==========Client Server(XueGod64)
檢查是否已安裝
rpm -qa subversion
如果要卸載舊版本
yum remove subversion
軟件安裝
#包括HTTP所需模塊一起裝(httpd mod_auth_mysql 是安裝配合Apache的模塊,你可以只裝subversion,多裝了也無所謂) [root@XueGod63 ~]# yum install -y subversion httpd mod_dav_svn #查看已注冊 [root@XueGod63 ~]# cat /etc/services | grep --color svn
svn 3690/tcp # Subversion
svn 3690/udp # Subversion
創(chuàng)建版本庫目錄
#存放版本庫的主目錄 [root@XueGod63 ~]# mkdir /www/svn/ #創(chuàng)建項(xiàng)目 #svnadmin命令是由subversion這個(gè)軟件包提供的 [root@XueGod63 ~]# svnadmin create /www/svn/test_project #隨便查看一個(gè)版本庫 [root@XueGod63 ~]# ls /www/svn/test_project
conf db format hooks locks README.txt
dav目錄:是提供apache與mod_dav_svn使用的目錄,讓他們存儲內(nèi)部數(shù)據(jù),剛開始新建時(shí)此目錄沒有
db目錄:就是所有版本控制的數(shù)據(jù)存放文件
hooks目錄:放置hook腳本文件的目錄
locks目錄:用來放置subversion監(jiān)控鎖定數(shù)據(jù)的目錄,用來追蹤存取文件庫的客戶端
format文件:是一個(gè)文本文件,里面只放了一個(gè)整數(shù)。表示當(dāng)前文件庫配置的版本號
conf目錄:是這個(gè)倉庫的配置文件(倉庫的用戶訪問賬號、權(quán)限等),也是我們要關(guān)注的配置文件
[root@XueGod63 ~]# ls /www/svn/test_project/conf/
authz passwd svnserve.conf
authz #認(rèn)證權(quán)限相關(guān)
passwd #用戶名和密碼
svnserve.conf #服務(wù)器配置文件
針對不同版本庫修改配置文件
接下來的一段用于配置使用哪種授權(quán)登錄方式;
#修改xuegod.cn的配置文件 [root@XueGod63 ~]# vim /www/svn/test_project/conf/svnserve.conf
[general]
anon-access = none #對于匿名用戶,無訪問權(quán)限,這里必須為none,因?yàn)橹挥性O(shè)為none,在客戶端才能看到每次提交的備注信息
auth-access = write #對于授權(quán)用戶,有寫權(quán)限,可以是read,write,none
#password-db = passwd #用戶名和密碼都是明文存放在同級目錄下的passwd文件中;優(yōu)點(diǎn)是高效配置簡單,缺點(diǎn)是安全性弱,明文總不是那么讓人感覺可靠
authz-db = authz #認(rèn)證權(quán)限文件,取消注釋即可
realm = test_project #指定授權(quán)所屬的域,PHP的同志可將其理解為名字空間;
#接下來是[sasl]段,用于標(biāo)識是否進(jìn)行SASL加密處理;
use-sasl=true
min-encryption=128
max-encryption=256
#變量 min-encryption 和 max-encryption 控制服務(wù)器所需要的加密強(qiáng)度。
注意:此配置文件的所有內(nèi)容必須頂格,否則會報(bào)錯(cuò)
配置用戶和密碼及認(rèn)證權(quán)限
#設(shè)置用戶名和密碼 [root@XueGod63 ~]# vim /www/svn/test_project/conf/passwd
[users]
Find = 123456
HA = 123456
user = 123456
#末尾添加上面三行
#對于部分版本,前面的[users]是有#號的,如果有#號,一定要取消,否則只能使用匿名用戶登錄,客戶端登錄不會
出現(xiàn)登錄窗口或密碼提示,除非在配置文件將anon設(shè)置為none,否則將返回一個(gè)錯(cuò)誤
#這里的密碼都是明文,沒有加密
#設(shè)置用戶和組的權(quán)限 [root@XueGod63 ~]# vim /www/svn/test_project/conf/authz
[groups] #此行默認(rèn)存在了
test_group=Find,HA #定義組,在[groups]下面添加
#用戶組格式 用戶組名=用戶1,用戶2
#一個(gè)組可以包含多個(gè)用戶,英文逗號間隔,用戶名必須是在passwd中存在的
[test_project:/] #/表示我當(dāng)前所在版本庫目錄,這里代表test_project
@test_group = rw #@test_group表示這個(gè)組的權(quán)限,就是上面定義的組的成員
* = #除了上面的有賦予權(quán)限成員之外,其他的成員都沒有權(quán)限
SVN目錄格式:
[/目錄名]
@用戶組名 = 權(quán)限
用戶名 = 權(quán)限
* =
SVN使用SASL加密
1.配置svnserve.conf,注釋掉password-db=passwd
并啟用sqsl:use-sasl=true
2.新建一個(gè)svn.conf文件,一般放在/usr/lib/sasl2或者/etc/sasl2,內(nèi)容為:
pwcheck_method: auxprop
auxprop_plugin: sasldb
sasldb_path: /home/svnadmin/config/sasldb
mech_list: DIGEST-MD5
其中sasldb_path 指定你打算將sasl加密的數(shù)據(jù)庫放置的位置;
注釋:pwcheck_method指明檢查的方法,這里是“auxprop ”,這個(gè)pwcheck_method還對應(yīng)了如啟動(dòng)一個(gè)代理作為認(rèn)證服務(wù)等方式,而現(xiàn)在的意思就是使用本文件說的方式去檢查。然后我們指明auxprop_plugin為sasldb,也就是使用一個(gè)文件存放用戶名密碼,也就是/www/svn/test_project/sasldb,其它的認(rèn)證信息存放plugin還有sql和ldapdb。而mech_list指明了認(rèn)證信息傳遞機(jī)制。
svnserve 已經(jīng)在運(yùn)行,你需要重啟服務(wù),并確保它讀取了更新后的配置參數(shù)
killall svnserve //停止svnserve服務(wù)
svnserve –d –r /www/svn //啟動(dòng)svnserve服務(wù)
3.創(chuàng)建用戶和密碼
使用saslpasswd2 程序
語法:saslpasswd2 –c –f /www/svn/test_project/sasldb –u [svnserve.conf里面配置的realm名字] [username]
eg:saslpasswd2 -c -f /home/svnadmin/config/sasldb -u examPro colin
會出現(xiàn)交互界面,提示輸入兩次密碼;
附:
saslpasswd2 -d -f home/svnadmin/config/sasldb -u 用戶名//刪除用戶
sasldblistusers2 -f /home/svnadmin/config/sasldb // 查詢用戶
PS:如果訪問庫的時(shí)候出現(xiàn)以下提示 "Could not obtain the list of SASL mechanisms",原因是Linux默認(rèn)沒有安裝DIGEST-MD5,此時(shí),可用以下命令安裝更新:yum install cyrus-sasl-md5 , cyrus-sasl-md5首頁:http://asg.web.cmu.edu/sasl/, 安裝包下載地址:ftp://ftp.andrew.cmu.edu/pub/cyrus/
配置完成。
服務(wù)SVN啟動(dòng)及創(chuàng)建測試代碼
#啟動(dòng)了所有版本庫,如果只需要某一個(gè)版本庫, #在-r后面添加/www/svn/test_project/的版本庫即可 -d=daemon -r=root of directory of save指定根目錄 [root@XueGod63 ~]# svnserve -d -r /www/svn/ #查詢到下面這行內(nèi)容就可以了 [root@XueGod63 ~]# ps -aux | grep svn
root 17107 0.0 0.0 199020 1028 ? Ss 23:30 0:00 svnserve -d -r /www/svn/
root 17446 0.0 0.0 110228 892 pts/0 S+ 23:32 0:00 grep --color=auto svn
[root@XueGod63 ~]# netstat -antup | grep svn
服務(wù)正常
tcp 0 0 0.0.0.0:3690 0.0.0.0:* LISTEN 17107/svnserve
使用svn導(dǎo)入測試代碼
導(dǎo)入測試代碼格式: svn [選項(xiàng)] 源碼 svn://server ip/項(xiàng)目名
常見的選項(xiàng):
import:將未版本化的文件納入版本控制并提交 checkout:從版本庫中檢出一個(gè)修訂版 update:更新工作拷貝 add,delete,copy,move:增、刪、復(fù)制、移動(dòng)文件或目錄
status:檢查狀態(tài)差異 diff:檢查文件行級詳細(xì)差異
revert:恢復(fù) resolve:解決沖突
switch:切換工作拷貝對應(yīng)的版本庫分支 log:查看歷史記錄
list:顯示文件目錄 cat:查看某個(gè)文件內(nèi)容
開放svn端口
默認(rèn)是3690端口,你也可以用別的。已開啟的跳過這一步
vi /etc/sysconfig/iptables #修改 iptables -I INPUT -p tcp --dport 3690 -j ACCEPT #保存 service iptables save #重啟 service iptables restart #查看 /etc/init.d/iptables status
在網(wǎng)站根目錄建立SVN版本庫
為了避免每次都重新輸入SVN賬號密碼,可修改以下配置
[root@localhost public_html]# vim /root/.subversion/servers
把
# store-plaintext-passwords=no
改為
store-plaintext-passwords=yes
建立版本庫
#打開網(wǎng)站根目錄,我的根目錄是/www/web/test_com/public_html [root@XueGod63 ~]# cd /www/web/test_com/public_html #在網(wǎng)站根目錄建立版本庫,由于當(dāng)前已經(jīng)在網(wǎng)站根目錄,所以用 . 表示建立版本庫的目錄 #也可以使用絕對路徑 /www/web/test_com/public_html [root@XueGod63 ~]# svn checkout svn://192.168.1.2/test_project . #提示輸入SVN帳號和密碼,輸入以上設(shè)置的SVN帳號密碼即可
提交網(wǎng)站根目錄的源碼到SVN服務(wù)器
把網(wǎng)站的所有文件提交到SVN服務(wù)器
#把項(xiàng)目加入到SVN庫,并提交 [root@XueGod63 ~]# svn add app/ [root@XueGod63 ~]# svn add include/ [root@XueGod63 ~]# svn add template/ [root@XueGod63 ~]# svn add runtime/ [root@XueGod63 ~]# svn add index.php [root@XueGod63 ~]# svn commit -m "初次提交"
在開發(fā)環(huán)境(本地)檢出項(xiàng)目
在本地項(xiàng)目檢出SVN,SVN地址:svn://192.168.1.2/test_project
d:守護(hù)進(jìn)程
-r:svn根目錄
假設(shè)服務(wù)端IP為192.168.1.2,那么如下設(shè)置后test_project的訪問目錄就為:
svn://192.168.1.2/test_project
比如 帳號密碼為上面設(shè)置的Find = 123456,檢出。
SVN上傳時(shí)同步到服務(wù)器其它目錄
同步程序思路:用戶提交程序到SVN,SVN觸發(fā)hooks,按不同的hooks進(jìn)行處理,這里用到的是post-commit,利用post-commit到代碼檢出到SVN服務(wù)器的本地硬盤目錄,再通過rsync同步到遠(yuǎn)程的WEB服務(wù)器上。
知識點(diǎn):
1、SVN的hooks
# start-commit 提交前觸發(fā)事務(wù)
# pre-commit 提交完成前觸發(fā)事務(wù)
# post-commit 提交完成時(shí)觸發(fā)事務(wù)
# pre-revprop-change 版本屬性修改前觸發(fā)事務(wù)
# post-revprop-change 版本屬性修改后觸發(fā)事務(wù)
通過上面這些名稱編寫的腳本就就可以實(shí)現(xiàn)多種功能了,相當(dāng)強(qiáng)大。
2、同步命令rsync的具體參數(shù)使用
3、具有基個(gè)語言的編程能力bash python perl都可以實(shí)現(xiàn)
post-commit具體實(shí)現(xiàn)細(xì)節(jié)
post-commit腳本
能看到一堆模版鉤子文件,我們需要的是post-commit.tmpl,
copy一份,命名為post-commit。然后修改;
編輯文件:
sudo vim /www/svn/test_project/hooks/post-commit
注意:編輯完成post-commit后,給予可執(zhí)行權(quán)限:
sudo chmod -R 755 /www/svn/test_project/hooks/post-commit
內(nèi)容:
#!/bin/sh #設(shè)置語言環(huán)境 ##這行比較重要,需要根據(jù)你的服務(wù)器環(huán)境選擇正確的語言環(huán)境,否則,這個(gè)update不會工作 export.UTF-8 #設(shè)置SVN更新時(shí)需要同步更新的目錄,這里發(fā)現(xiàn)不加username和password也是可以的 #svn update /www/web/test_com/public_html --username yoursname --password yourpwd sudo svn update /www/web/test_com/public_html
這樣在本地SVN提交代碼后,服務(wù)器的代碼也會自動(dòng)從SVN更新。
注意:svn倉庫文件夾的other必須要有執(zhí)行權(quán)限不然腳本無法執(zhí)行。SVN update 之前一定要先手動(dòng)checkout一份出來,還有這里一定要添加用戶和密碼如果只是手動(dòng)一樣會更新,但自動(dòng)一樣的不行。
啟動(dòng)和停止SVN服務(wù)
啟動(dòng)SVN服務(wù)
svnserve -d -r /www/svn/
描述說明:
-d 表示svnserver以“守護(hù)”進(jìn)程模式運(yùn)行
-r 指定文件系統(tǒng)的根位置(版本庫的根目錄),這樣客戶端不用輸入全路徑,就可以訪問版本庫。
如果想監(jiān)聽其他端口,使用
svnserve -d -r /www/svn/ --listen-port 88
停止SVN服務(wù)
killall svnserve
設(shè)置開機(jī)自啟動(dòng)
安裝好的svn服務(wù)端,默認(rèn)是不會開機(jī)自啟動(dòng)的,每次開機(jī)自己啟動(dòng)會很麻煩,我們可以把它設(shè)成開機(jī)啟動(dòng)。
首先:編寫一個(gè)啟動(dòng)腳本svn_startup.sh,我放在/www/svn/svn_startup.sh
#!/bin/bash /usr/bin/svnserve -d -r /www/svn/ --listen-port 88
如果是部署為外網(wǎng),這里自定義了88端口,需要注意檢出地址需要加上自定義的端口號。(貌似自定義端口號后不能使用post-commit自動(dòng)提交了,會提示拒絕連接,還沒有找到使用自定義端口連接的方法)
這里的svnserve路徑保險(xiǎn)起見,最好寫絕對路徑,因?yàn)閱?dòng)的時(shí)候,環(huán)境變量也許沒加載。
絕對路徑怎么查?
which svnserve
這里還有可能碰到一個(gè)問題,如果你在windows下建立和編寫的腳步,拿到linux下,用vi或者vim修改后可能會無法執(zhí)行,這是文件格式的問題:
vi svn_startup.sh #輸入:set ff 回車 #如果顯示的結(jié)果不是fileformat=unix #再次輸入 set ff=unix #就OK了
然后修改該腳本的執(zhí)行權(quán)限:
chmod ug+x svn_startup.sh #或者萬能的 chmod 777 svn_startup.sh
最后,加入自動(dòng)運(yùn)行:
vi /etc/rc.d/rc.local #在末尾添加腳本的路徑,如: /www/svn/svn_startup.sh
現(xiàn)在,你可以重啟一下試試了。
ps -ef|grep svnserve