搭建SVN版本控制服务器
搭建SVN版本控制服務器
一:實驗目標
實戰:搭建svn服務器+ apache版本控制服務器?
二:實驗環境
? ? ? ? ? ? ? ? ?系統版本: rhel-server-6.5-x86_64-dvd
SVN+apache服務端:xuegod63.cn IP:192.168.1.63
客戶端:xuegod64.cn IP:192.168.1.64
服務概述:
????由于各個公司所對服務的需求不同,會安裝各種不同版本的服務軟件,所以管理起來會很困難。在此環境中,會出現代碼沖突,項目不同版本的發布困難甚至代碼整合期間會出現bug。如果一個項目是由多個開發人員共同開發的,但是這些個開發人員都不在個地方,那么如何來完成這個項目的開發呢?隨著問題的出現,應運而生了各種版本控制軟件。其中市場上較為常見的版本控制軟件有cvs,svn和git。Cvs已經成為了過去式,svn是當下較為流行的,是cvs的接班人。
?
Svn的運行模式有兩種 | ||
模式 | 端口 | 運行模式 |
svn | 3690 | C/S |
svn+apache | 80 | C/S |
svn的基本工作原理:
????服務器上建立一個源代碼庫,庫里可以存放許多不同項目的源程序。有源代碼庫管理員統一管理這些源程序。每個用戶在使用源代碼庫之前,首先要把源代碼庫里德項目文件下載到本地,然后開發人員可以在本地修改,然后用svn命令進行提交,由源代碼庫統一管理修改。
?
mod_dav_svn的作用
?????由于Subversion需要版本化的控制,因此標準的HTTP協議不能滿足需求。要讓Apache與Subversion協同工作,就要使用WebDAV(Web-basedDistributedAuthoringandVersiong)Web分布式創作和版本控制協議。WebDAV是HTTP1.1的擴展,關于WebDAV的規范和工作原理,可以參考IETFRFC2518。簡單的說mod_dav_san模塊就是作為Subversion與Apache之間的接口的連接線,通過它,Apache就可以訪問版本庫,并且可以讓客戶端也使用HTTP的擴展協議WebDAV/DeltaV進行訪問
?
三:實驗代碼
環境安裝svn.apache和mod_dav_svn模塊 ?
[root@xuegod64 ~]# vim /etc/services
?
[root@xuegod63~]#yum install subversion httpd mod_dav_svn -y
?
配置xuegod63上的svn服務器
1:建立一個用戶,用于管理SVN版本庫,類似于這個庫的管理員
[root@xuegod63~]#useradd svn
2:創建版本庫目錄,并修改相應權限,管理員對這個庫的權限
[root@xuegod63~]#mkdir /var/repos
[root@xuegod63~]#chown svn.svn /var/repos
3:創建兩個項目倉庫。 svn1和svn2
[root@xuegod63 ~]# su - svn
[svn@xuegod63 ~]$ svnadmin create /var/repos/svn1 ??
[svn@xuegod63 ~]$ svnadmin create /var/repos/svn2 #管理員創建版本控制倉庫svn
[svn@xuegod63 ~]$ cd /var/repos/svn1
[svn@xuegod63 svn1]$ ls
conf ?db ?format ?hooks ?locks ?README.txt
[svn@xuegod63 svn1]$ ls conf/
authz ?passwd ?svnserve.conf?
?
查看配置中的各個文件的作用
[root@xuegod63 repos]# cat /var/repos/svn1/conf/authz
注釋:? | 每個文件的作用 |
Authz | 權限 |
Passwd | 用戶名和密碼 |
svnserve.conf | 服務器的配置文件 |
?
[root@xuegod63 repos]# cat /var/repos/svn1/conf/svnserve.conf
anon-access?=?none | #匿名訪問的權限,可以是read,write,none,默認為read,如果你不愿意匿名共享請配置為none |
auth-access=write | #認證用戶的權限,可以是read,write,none,默認為write |
password-db=passwd | #密碼數據庫的路徑,去掉前面的#,默認使用的是同一目錄下的passwd文件作為用戶認證方式 |
authz-db=authz | #權限驗證文件 |
realm=svn1 | #此選項指定庫的認證領域。 |
?
[root@xuegod63 conf]# cat /var/repos/svn1/conf/passwd
注:格式為:用戶名=密碼 | |
注意 | |
1. | 一定要去掉[users]前面的#,否則svn只能以匿名用戶登錄,客戶端不會出現登錄窗口戒密碼提示,除非你的anon不為none,否則將迒回一個錯誤。 |
2. | 這里的密碼都是明文沒有加密的。 |
?
4:修改配置文件authz
[root@xuegod63 conf]# vim /var/repos/svn1/conf/authz #在最后添加以下內容:
參數說明:[groups] | |
Admin?=?tube | #創建一個組admin,admin組中有成員tube。 |
[/] @admin = rw | #表示admin組中所有成員,可以讀寫/var/repos中所有文件。 |
[/var/repos/svn1] user1 = rw | rw(表示user1能夠讀寫/var/repos/svn1目錄下的所有信息) |
[/var/repos/svn2] user2=r? | user2=r(表示user2能夠讀/var/repos/svn2目錄下的所有信息) |
?
5:啟動SVN服務器
#使用用戶svn來管理版本庫目錄/var/repos,則須轉為svn用戶,命令如下:?
[svn@xuegod63 conf]$ svnserve -d -r /var/repos/
d | 表示以daemon方式(后臺運行)運行 |
r | 指定根目錄是/var/repos |
[svn@xuegod63 conf]$ netstat -antup | grep 3690
tcp 0 0 0.0.0.0:3690 0.0.0.0:* LISTEN 7262/svnserve
?
6:iptables開放服務器端口 :svn默認端口是3690
[root@xuegod63 ~]# iptables -A INPUT -p tcp --dport 3690 -j ACCEPT
[root@xuegod63 ~]# /etc/init.d/iptables save
?
7:管理員上傳源代碼到庫中
[root@xuegod63 ~]# cp extundelete-0.2.4.tar.bz2 /home/svn #拷貝到管理員家中
[svn@xuegod63 ~]$ tar jxvf extundelete-0.2.4.tar.bz2
[svn@xuegod63 ~]$ mv extundelete-0.2.4 extundelete
[svn@xuegod63 ~]$ cd extundelete
[svn@xuegod63 extundelete]$ ls
acinclude.m4 ?config.h.in ??depcomp ????Makefile.am ?README
aclocal.m4 ???configure ????install-sh ?Makefile.in ?src
autogen.sh ???configure.ac ?LICENSE ????missing
?
?
8:管理員把源代碼導到SVN服務器上--獨立服務器的方式
[svn@xuegod63 ~]$ svn import extundelete/ file:///var/repos/svn1 -m 'svn v1'?
?
9:查看apache支持subversion兩個動態庫有沒有安裝成功。 ?
[root@xuegod63 conf]# vim /etc/httpd/conf.d/subversion.conf #看到下面配置文件中兩個模塊相關信息,說明安裝成功。
LoadModule dav_svn_module ???modules/mod_dav_svn.so
LoadModule authz_svn_module ?modules/mod_authz_svn.so
?
配置xuegod63上的apache服務器
1:配置apache支持SVN
[root@xuegod63 ~]# vim /etc/httpd/conf/httpd.conf #將apache使用的用戶和組都改為svn的管理員
User svn
Group svn
?
2:配置apache下的svn,知道倉庫,認證路徑等
[root@xuegod63 ~]# vim /etc/httpd/conf.d/subversion.conf
<Location /svn>
DAV svn
SVNParentPath /var/repos #倉庫的根目錄
AuthType Basic ?#認證類型
AuthName "Subversion repository" ?#認證窗口,彈出的消息
AuthUserFile /home/svn/passwd ?#認證用戶的路徑
AuthzSVNAccessFile /home/svn/auth ?#建立本地項目版本庫的權限控制文件
Require valid-user
</Location>
?
3:建立訪問控制文件/home/svn/passwd---類似于代碼開發人員的用戶
#后期通過httpd服務器訪問svn時,會使用這個文件中的用戶信息驗證用戶和密碼。
生成用戶和密碼的工具
[root@xuegod63 ~]# which htpasswd
/usr/bin/htpasswd
[root@xuegod63 ~]# rpm -qf /usr/bin/htpasswd
httpd-tools-2.2.15-29.el6_4.x86_64 ?
[root@xuegod63 ~]# htpasswd -c /home/svn/passwd tube # -c #如果沒有/home/svn/passwd則創建。會提示你輸入密碼,默認是MD5加密
New password: 123456
Re-type new password: 123456
[root@xuegod63 ~]# htpasswd /home/svn/passwd mk #后期再創建時,就不需要加-c參數,否則,會把之前添加到/home/svn/passwd中信息,全部覆蓋。
[root@xuegod63 ~]# htpasswd /home/svn/passwd testuser3
查看用戶名和密碼:
[root@xuegod63 ~]# cat /home/svn/passwd
tube:ll7IH3i5G0JfU
mk:KvoOCCmj2qla2
testuser3:tSp3bA63WPGXU
?
4:建立本地項目版本庫的權限---類似于代碼開發人員的權限
[root@xuegod63 ~]# vim /home/svn/auth #寫入以下內容
[/]
tube = rw
[svn1:/]
@group1 = rw
?= rw
[svn2:/]
@group2 = rw
[groups]
group1 = testuser1,testuser2
group2 = testuser3,testuser4
?
解釋:
[/] # 表示所有倉庫的根目錄
tube = rw # 表示tube用戶對所有倉庫的根目錄都有rw權限?
[svn1:/] #表示倉庫svn1的根目錄
@group1 = rw #group1組中的用戶對svn1倉庫有讀寫權限 ,如果在前面加上@符號,則表示這是個群組權限設置,
mk = rw # mk用戶對svn1倉庫具有讀和寫權限
[svn2:/]
@group2 = rw
[groups]
group1 = testuser1,testuser2 // 這個表示某群組里的成員
group2 = testuser3,testuser4
?
5:重啟httpd服務,訪問svn
[root@xuegod63 ~]# service httpd restart
用戶的作用總結 | |
用戶名 | 對所屬庫的權限 |
Svn | 是svn服務器中的庫管理員 |
Tube | 是對整個svn庫擁有讀寫權限 |
Mk | 是對svn庫中的svn1庫擁有讀寫權限,類似于開發人員 |
Testuser3 | 是對svn庫中的svn2庫擁有讀寫權限,并且Testuser3屬于group2,類似于開發人員 |
測試svn版本控制服務器
?
svn的訪問地址是: http://192.168.1.63/svn/svn1
1:測試開發人員對不同庫的訪問權限:
???1)http://192.168.1.63/svn/svn1 ,輸入用戶: mk 密碼: 123456
?
?
??2)http://192.168.1.63/svn/svn2 ,輸入用戶: mk 密碼: 123456
?
?
???3)http://192.168.1.63/svn/svn2/ 用戶:testuser3 ,密碼:123456 可以訪問svn2
?
?
2:測試開發人員對庫中采取的不同動作
1)?把本地項目extundelete-0.2.4.tar.bz2整個源代碼導入到版本庫: svn2中。 沒有導入前,svn2倉庫初始版本為 0 。
語法:svn 源代碼目錄 file:///path/to/repos -m "最后的這個注釋不能少"
[svn@xuegod63 ~]$mkdir test1
[svn@xuegod63 ~]$?tar jxvf extundelete-0.2.4.tar.bz2
[svn@xuegod63 ~]$svn import extundelete-0.2.4/ file:///var/repos/svn2 -m 'svn2 v1'
?
#這里不再為0,顯示為1,說明監控版本變化成功
?
2)取回項目代碼
方法1: 直接在svn中取回
語法:svn checkout file:///var/repos/svn1 目錄
[svn@xuegod63 ~]$?svn checkout file:///var/repos/svn1??new
或者:
[svn@xuegod63 ~]$?svn checkout file:///var/repos/svn1
#將svn1版本庫中的文件取回到目錄aaaa中,沒有aaaa目錄,將自動生成一個aaaa目錄。 如果不指定目錄,直接存到當前目錄下,將以svn1倉庫的名字命名并創建對應的目錄。
#除了代碼以外,還多了一個?.svn?目錄
?
方法二:通過http協議
[svn@xuegod63 ~]$svn checkout http://192.168.1.63/svn/svn1 bbb
Authentication realm: <http://192.168.1.63:80> Subversion repository
Password for 'root': 直接回車
Authentication realm: <http://192.168.1.63:80> Subversion repository
Username: mk
Password for '':123456
?
?
3:在xuegod64中測試testuser3訪問:
[root@xuegod64 ~]# svn checkout http://192.168.1.63/svn/svn1 bbb
Authentication realm: <http://192.168.1.63:80> Subversion repository
Username: testuser3
Password for 'testuser3':
svn: Server sent unexpected return value (403 Forbidden) in response to OPTIONS request for 'http://192.168.1.63/svn/svn1'
?
4:修改或添加刪除文件后,提交代碼。
[root@xuegod63 test3]# svn checkout http://192.168.1.63/svn/svn1 extundelete
Authentication realm: <http://192.168.1.63:80> Subversion repository
Password for 'mk':
[svn@xuegod63 ~]$?cd extundelete
[svn@xuegod63 ~]$?cp /etc/hosts c.txt
[svn@xuegod63 ~]$cp /etc/hosts b.txt
[svn@xuegod63 ~]$?cp /etc/hosts a.txt
[svn@xuegod63 ~]$?svn add c.txt #添加一個文件到版本庫中
A ??c.txt
[root@xuegod63 svn1]# svn delete autogen.sh #從版本庫中刪除一個文件
D ?autogen.sh
[root@xuegod63 extundelete-0.2.4]# ls #查看,沒有沒有autogen.sh 文件了
[root@xuegod63 extundelete]# svn status #查看項目當前狀態。
? a.txt
? b.txt
A c.txt
D autogen.sh
?
提交修改:
[root@xuegod63 extundelete-0.2.4]# svn commit -m #"注釋,添加一個文件c.txt" #提交你的改變到版本庫中,后面參數為此次提交的注釋.
[root@xuegod63 extundelete-0.2.4]# svn list # 列出版本庫中當前目錄下的文件?
[root@xuegod63 extundelete]# svn move c.txt mk.txt #將c.txt文件更名為mk.txt
A mk.txt
D c.txt
?
5:xuegod64取出版本:?
[root@xuegod64 svn1]# svn checkout http://192.168.1.63/svn/svn1/
[root@xuegod64 svn1]# svn co http://192.168.1.63/svn/svn1/?
總結
以上是生活随笔為你收集整理的搭建SVN版本控制服务器的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: ObjectARX_图形数据库
- 下一篇: Oracle数据库中的违规策略规则的修正