Linux上subversion的安裝和使用

目錄

1、Linux上subversion下載... 3

2、Linux上subversion的安裝... 6

2.1、查詢系統之前安裝的舊版本... 6

2.2、yum安裝yum源默認版本... 7

2.3、yum安裝自定義版本... 8

3、Linux上SVN服務端和客戶端環境搭建... 13

3.1、服務端命令與客戶端命令... 13

3.2、版本庫的創建與刪除... 13

3.3、版本庫配置及權限分組... 15

3.4、版本庫的訪問... 20

3.4.1、啓動... 21

3.4.2、windows客戶端的訪問:... 21

3.4.3、Linux上客戶端的訪問... 23

3.4.3、重啓... 26

3.5、svn服務自動啓動... 27

4、svn的基本操作... 28

4.1、svn的常見術語及文件狀態... 28

4.2、checkout與export的區別於使用... 33

4.3、add、ci、up、del 33

4.4、客戶端diff、mkdir、cat. 34

4.5、工作副本還原revert. 35

4.6、二進制衝突與樹衝突... 35

4.7、鎖定lock與解鎖unlock. 36

5、svn的進階應用... 37

5.1、ls、st、log、info. 37

5.2、多版本庫解決方案... 37

5.1.1、不同端口啓動多個版本庫... 38

5.1.2、一個端口啓動多個版本庫... 39

5.3、svn的copy命令... 40

5.4、主幹版本與分支版本... 41

6、svn的高級應用... 42

6.1、hooks鉤子應用... 42

6.2、版本庫精簡... 47

6.3、版本庫的遷移與重定向... 49

6.3.1、版本庫的遷移... 49

6.3.2、版本庫的重定向... 50

7、svn常見的坑... 51

 

 

 

1、Linux上subversion下載

Linux上運行的SVN 是將服務端和客戶端綁定在subversion裏面的,所以下載的時候只需要下載一個subversiontar包。

Windows上SVN客戶端官網:https://tortoisesvn.net/

Linux上SVN官網:http://subversion.apache.org/

進入SVN客戶端TortoiseSVN官網(也可以直接進入Linux上SVN官網)

點擊Apache™ Subversion (SVN)® 進入Apache的版本控制頁

http://subversion.apache.org/

點擊Source Download 進入下載頁

或者在該下載頁的下面有當前最新版和當前上一個版本,以及發佈存檔庫

點擊archive download site進入舊版本倉庫

選擇需要的版本直接點擊下載,或者複製鏈接保存,再到Linux上進行下載。

複製subversion-1.10.2.tar.gz版本鏈接

http://mirrors.hust.edu.cn/apache/subversion/subversion-1.10.2.tar.gz

複製subversion-1.9.9.tar.gzz版本鏈接

http://mirrors.hust.edu.cn/apache/subversion/subversion-1.9.9.tar.gz

2、Linux上subversion的安裝

2.1、查詢系統之前安裝的舊版本

svn --version

自己決定是否卸載

卸載命令

yum remove subversion

查看是否卸載完成

[root@localhost ~]# svn --version

卸載完成

2.2、yum安裝yum源默認版本

查看yum源中subversion的版本

[root@localhost ~]# yum list subversion

執行yum源安裝subversion

[root@localhost ~]# yum -y install subversion

查詢安裝是否完成

[root@localhost ~]# svn --version

安裝完成。

2.3、yum安裝自定義版本

在yum源配置文件中配置自己需要的軟件版本yum源。

http://opensource.wandisco.com/這個網址是wandisco整理的rpm包,在這個網址下有各種版本的subversion。

subversion1.10版本的rpm包地址:

http://opensource.wandisco.com/centos/7/svn-1.10/RPMS/

在該路徑下是subversion通過yum源安裝的配置文件和rpm包以及當前版本的依賴。

卸載舊版本

[root@localhost ~]# yum remove subversion

清除yum緩存

yum 會把下載的軟件包和header存儲在cache中,而不自動刪除。如果覺得佔用磁盤空間,可以使用yum clean指令進行清除,更精確 的用法是yum clean headers清除headeryum clean packages清除下載的rpm包,yum clean all一全部清除。

[root@localhost ~]# yum clean all

在yum配置文件中添加設置subversion1.10的yum源

查看系統yum源配置文件

[root@localhost ~]# cd /etc/yum.repos.d/

備份系統默認的yum配置文件(複製一份並添加文件後綴名爲.back)

[root@localhost yum.repos.d]# cp CentOS-Base.repo CentOS-Base.repo.back

備份完成

用編輯器打開該配置文件

[root@localhost yum.repos.d]# vi CentOS-Base.repo

在文件中追加配置

[WandiscoSVN]

		<p style="margin-left:0cm;">name=Wandisco SVN Repo</p>

		<p style="margin-left:0cm;">baseurl=http://opensource.wandisco.com/centos/$releasever/svn-1.10/RPMS/$basearch/</p>

		<p style="margin-left:0cm;">enabled=1</p>

		<p style="margin-left:0cm;">gpgcheck=0</p>
		</td>
	</tr></tbody></table></div><p style="margin-left:0cm;"><img alt="" class="has" height="232" src="https://img-blog.csdnimg.cn/2019040722440981.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzM2OTM4NjE3,size_16,color_FFFFFF,t_70" width="751"></p>

保存退出

查看添加配置後yum源中可以安裝的subversion的版本

[root@localhost yum.repos.d]# yum list subversion

安裝subversion

[root@localhost ~]# yum -y install subversion

查看安裝

[root@localhost ~]# svn --version

安裝高版本替換低版本成功

3、Linux上SVN服務端和客戶端環境搭建

3.1、服務端命令與客戶端命令

在subversion中包含有服務端和客戶端,在執行命令時需要分清服務端命令和客戶端命令。

服務端命令:

svnserver                    #控制svn系統服務的啓動等

svnadmin                    #svn版本庫的創建/導入/導出/刪除等

svnlook                        #查看版本庫的信息

客戶端命令:

svn                               #版本庫的檢出/更新/提交/重定向等

3.2、版本庫的創建與刪除

創建保存版本庫的目錄

例:

在/usr/local/創建svn的保存版本庫的目錄SvnRepository

[root@localhost ~]# mkdir /usr/local/SvnRepository

創建svn版本庫

svnadmin create 路徑

版本庫沒有指定一定需要創建在某個目錄下

[root@localhost ~]# svnadmin create /usr/local/SvnRepository/testrpo

		<p style="margin-left:0cm;">#在/usr/local/SvnRepository/目錄下創建testrpo版本庫</p>
		</td>
	</tr></tbody></table></div><p style="margin-left:0cm;"><img alt="" class="has" height="83" src="https://img-blog.csdnimg.cn/2019040722440891.png" width="526"></p>

在創建的這個版本庫下會自動創建svn相關的配置文件

創建版本庫時可以配置的參數:

--fs-type             #用來指定版本庫數據保存類型,該參數的類型有fsfs和dbd,推薦使用fsfs數據類型。

例如:在/usr/local/SvnRepository/目錄下創建testrpo1版本庫並指定版本庫保存數據的類型爲fsfs。

刪除版本庫:

rm -rvf 版本庫路徑

直接使用Linux的刪除命令將版本庫刪除即可

例:刪除/usr/local/SvnRepository/目錄下的testrpo2版本庫

[root@localhost SvnRepository]# rm -rvf testrpo2

3.3、版本庫配置及權限分組

版本庫的配置:
版本庫的配置文件位於創建的版本庫的目錄下的conf目錄下

該目錄下文件保存的信息分別爲:

authz:配置用戶組合用戶組的權限

passwd:配置用戶名和用戶密碼

svnserve.conf:配置默認權限、權限配置文件及密碼配置文件

svnserve.conf配置文件

使用編輯器打開svnserve.conf文件

[root@localhost conf]# vi svnserve.conf

將註釋掉的重要配置信息解註釋,更改未通過驗證的用戶權限爲none,其他配置爲默認

更改完成保存退出。

passwd配置文件:

使用編輯器打開passwd文件

[root@localhost conf]# vi passwd

添加用戶zxr密碼爲123456

添加完成保存退出。

authz配置文件:

使用編輯器打開authz文件

[root@localhost conf]# vi authz

用戶組(group)配置,該配置的格式爲組名等於用戶名列表,每個用戶需要用逗號隔開,每一行表示一個用戶組。

配置組的權限時需要在組的前面加上@符號

例:

用戶組配置:

配置用戶組pm,組員爲zxr

配置用戶組dev,組員爲zxr0,zxr1,zxr2

配置用戶組rookie,組員爲zxr3

pm = zxr

		<p style="margin-left:0cm;">dev = zxr0,zxr1,zxr2</p>

		<p style="margin-left:0cm;">rookie = zxr3</p>
		</td>
	</tr></tbody></table></div><p style="margin-left:0cm;"><img alt="" class="has" height="108" src="https://img-blog.csdnimg.cn/2019040722440868.png" width="341"></p>

指定根目錄配置用戶組權限:

pm組具有讀寫權限(rw),dev組只有讀權限(r),rookie組只有讀權限(r),

此處的讀(r)表示:在客戶端可以跟新服務器上的代碼到本地

此處的寫(w)表示:在客戶端可以提交代碼到服務器

[/]

		<p style="margin-left:0cm;">@pm = rw</p>

		<p style="margin-left:0cm;">@dev = r</p>

		<p style="margin-left:0cm;">@rookie = r</p>
		</td>
	</tr></tbody></table></div><p style="margin-left:0cm;"><img alt="" class="has" height="145" src="https://img-blog.csdnimg.cn/2019040722440867.png" width="246"></p>

指定版本庫配置權限:

配置testrpo版本庫權限爲pm組可讀寫(rw),用戶zxr1可讀寫(rw),用戶zxr2只能讀(r),用戶zxr3無權限

[testrpo:/]

		<p style="margin-left:0cm;">@pm = rw</p>

		<p style="margin-left:0cm;">zxr1 = rw</p>

		<p style="margin-left:0cm;">zxr2 = r</p>

		<p style="margin-left:0cm;">zxr3 =</p>
		</td>
	</tr></tbody></table></div><p style="margin-left:0cm;"><img alt="" class="has" height="90" src="https://img-blog.csdnimg.cn/20190407224407900.png" width="225"></p>

指定版本庫下的某個目錄或文件權限配置:

配置testrpo版本庫下的test01目錄的權限爲所有人可讀寫(rw)

[testrpo:/test01]

		<p style="margin-left:0cm;">* = rw</p>
		</td>
	</tr></tbody></table></div><p style="margin-left:0cm;">*表示所有用戶</p>

全部配置如圖

配置完成保存退出。

3.4、版本庫的訪問

svn是屬於集中式的版本庫解決方案,訪問拓撲圖:

SVN是跨平臺的,可以在任何系統上訪問SVN服務器上的內容。

3.4.1、啓動

指定啓動運行創建的版本庫testrpo

[root@localhost ~]# svnserve -d -r /usr/local/SvnRepository/testrpo

3.4.2、windows客戶端的訪問:

在Windows上安裝與服務端相同版本的svn的客戶端(TortoiseSVN)。安裝完成之後創建一個文件夾存放從服務器檢出的svn版本庫。

創建版本庫爲SVNRepo

進入SVNRepo目錄,點擊鼠標右鍵,點擊SVN Checkout(檢出),填寫URL,點擊確定。

彈出用戶認證信息

填寫完成用戶信息點擊確定。彈出檢出過程。

檢出完成,點擊確定。此時該目錄下會出現一個隱藏文件.svn

此時鏈接svn的服務器端成功

注意:在此鏈接過程中,如果出現鏈接不上,首先需要先telnet一下當前svn服務器的3690端口號,看端口是否開通,如果端口是通的,可能是svn服務器與客戶端的版本不兼容,如果端口不通,需要開通svn服務器上的3690端口。

centos7使用的防火牆爲firewalld開放端口方法是:

[root@localhost ~]# firewall-cmd --zone=public --add-port=3690/tcp --permanent

#開通防火牆3690端口號

[root@localhost ~]# systemctl restart firewalld.service

#重啓防火牆服務

[root@localhost ~]#  firewall-cmd --zone=public --list-ports

#查看所有打開的端口

1、firewalld的基本使用

啓動: systemctl start firewalld

關閉: systemctl stop firewalld

查看狀態: systemctl status firewalld

開機禁用  : systemctl disable firewalld

開機啓用  : systemctl enable firewalld

3.4.3、Linux上客戶端的訪問

在Linux上svn服務器上保存的是二進制文件,所以在svn服務器的版本庫中看不到提交到svn服務器上的文件,只有通過Linux上的客戶端才能看到svn版本庫中的文件。

在/usr/local/目錄下創建svn工作副本文件svnwork

[root@localhost local]# mkdir /usr/local/svnwork

進入創建的工作副本svnwork

[root@localhost local]# cd svnwork/

檢出svn版本庫

[root@localhost svnwork]# svn checkout svn://192.168.244.128

查看工作副本中的文件

[root@localhost svnwork]# ls

更新版本庫(必須先進入到檢出的目錄下執行該更新命令,否則會報錯沒有找到工作副本)

[root@localhost svnwork]# svn update

提交文件

[root@localhost svnwork]# touch cl.txt          #在當前svn工作副本中創建文件cl.txt

編輯cl.txt文件

[root@localhost svnwork]# vi cl.txt

編輯完畢保存退出

添加文件cl.txt文件到當前工作副本的svn庫中

[root@localhost svnwork]# svn add cl.txt

向svn服務器提交cl.txt文件

提交命令; svn commit -m "註釋" 需要提交的文件

[root@localhost svnwork]# svn commit -m "commit create file cl.txt" cl.txt

-m "commit create file cl.txt"表示註釋

提交成功,在Windows上的客戶端中檢測是否提交成功

進入Windows上的svn檢出工作副本,右鍵鼠標,點擊svn checkout

更新成功會,會看到在Linux上的客戶端提交的文件。

3.4.3、重啓

首先查看svn的進程:

查看進程命令:ps -ef(查看所有進程);要篩選的話用grep

篩選svn的進程命令:ps -ef|grep svn

[root@localhost SvnRepository]# ps -ef|grep svn

殺死主進程:

殺死進程的命令用kill -9 進程id

[root@localhost SvnRepository]# kill -9 12444                #殺死進程ID12444

啓動svn

啓動svn的命令用svnserve -d -r創建的版本庫路徑

-d表示svnserve.exe作爲服務程序運行在後臺;-r表示將創建的版本庫的目錄當作根目錄。

[root@localhost SvnRepository]# svnserve -d -r /usr/local/SvnRepository/testrpo

#啓動運行版本庫/usr/local/SvnRepository/testrpo

在此查看svn進程

重啓成功。

3.5、svn服務自動啓動

只需要在系統文件/etc/rc.local文件中添加啓動軟件的命令,就可以實現開機自動啓動,因爲系統啓動以後會加載這個文件。

啓動運行指定版本庫的命令:

svnserve -d -r /usr/local/SvnRepository/testrpo

使用編輯器打開/etc/rc.local文件進行編輯

[root@localhost ~]# vi /etc/rc.local

添加啓動命令

svnserve -d -r /usr/local/SvnRepository/testrpo

保存退出。

查看/etc/rc.local這個文件是否擁有執行權限,這個文件在centos7中默認是沒有執行權限的,如果沒有執行權限,開機是不能夠執行該文件的,因此需要賦予執行權限(x)

[root@localhost ~]# chmod +x /etc/rc.d/rc.local         #授予/etc/rc.d/rc.local文件寫的權限,/etc/rc.local這個文件只是/etc/rc.d/rc.local的快捷方式。

[root@localhost ~]# reboot            #重啓系統

[root@localhost ~]# ps -ef|grep svn               #查看svn的進程

開機自動啓動成功

4、svn的基本操作

4.1、svn的常見術語及文件狀態

常見術語:

版本庫、檢出、工作副本、更新、提交、版本、版本號

文件狀態:

無版本控制、增加、修改、常規、衝突、刪除、鎖定

研發A在客戶端的工作副本中新建文件或文件夾後的狀態爲:無版本控制

此時該文件並未加入版本控制中

要對“無版本控制”的文件加入到版本控制中需要執行“增加(add)”操作

此時該文件狀態稱爲“增加”

要對“增加”的文件加入到版本控制中需要執行“提交(commit)”操作,

執行提交操作以後服務器收到該文件以後進行保存操作,完成後將版本號加1,並向工作副本發送一個反饋信號,客戶端收到該信號以後,也將自己的工作副本加1,同時將提交的文件又變成“常規”狀態

當研發B進行了更新操作

研發B對文件進行了修改,此時文件的狀態變爲“修改”狀態

此時研發B向服務端提交了這些文件

以後,服務端保存後,版本號加1,變爲了2,並且客戶端二的版本也變成了2,此時它的文件也變成“常規”狀態

當研發三執行更新操作,默認更新得到的數據就是最新版本的數據,因此更新到了版本2,直接跳過了版本1,如果在更新的時候指定參數版本號,可以指定更新到指定的版本。

4.2、checkout與export的區別於使用

checkout           表示檢出

export                表示導出

checkout檢出的工作副本目錄中包含.svn文件夾,也就是checkout檢出的工作副本中存在.svn的文件,檢出後的文件是在版本控制之下的

export導出的工作副本目錄中沒有.svn文件夾,也就是單存的項目文件,沒有.svn的文件夾,並且導出後的文件不在版本控制之下,所以export導出的文件不能稱之爲工作副本,因爲.svn文件標記着工作副本的一切變化,如果是需要導出項目給客戶演示的話,直接導出就可以了,就不需要用到版本控制。

例:

svn checkout -r 2                       #檢出版本2

svn export -r 3                            #導出版本3

4.3、add、ci、up、del

add:添加文件到版本控制

svn add 文件目錄名 --non-recursive              #只增加指定的目錄,不增加文件目錄下的文件

svn add *          #增加當前目錄下的所有文件到版本控制中,如果是目錄增加了,目錄下的文件沒有增加,那該命令不會掃描已增加的目錄下未增加的文件

svn add * --force #強制執行添加所有沒有添加到版本控制中的文件或文件目錄

commit(ci):提交修改到服務端(創建一個新版本號)

svn commit -m “備註” 文件名       #提交指定文件到svn服務器(-m參數是必須要加的參數)

svn commit -m “備註” *          #提交當前目錄下所有修改過的文件

update(up):更新工作副本

svn update       #更新工作副本(默認情況下,每個文件只會從服務端更新一次最新版本)

svn update * #強制更新所有文件爲最新版本

svn update -r 版本號 文件名                 #指定更新到某個版本號

delete(del):從版本庫中刪除文件或目錄

svn delete 文件名           #從版本庫中刪除文件或目錄

svn delete -m “備註” 文件名                   #刪除文件時添加備註

4.4、客戶端diff、mkdir、cat

diff:版本差異比較

svn diff 文件名       #比較本地操作過的工作副本和本地最後一次從服務器更新的副本

svn diff -r 版本號 文件名     #比較當前修改過的文件和指定的歷史版本

svn diff -r 版本號1:版本號2    文件名     #比較兩個歷史版本中文件的差異

svn diff               #掃描所有修改過的文件和本地最後一次從服務器更新的副本比較

mkdir:創建目錄並增加到版本控制

svn mkdir test.txt              #創建文件test.txt文件並添加到版本控制中

cat:不檢出工作副本,直接查看指定文件(可以脫離工作副本)

svn cat svn://192.168.244.128/index                #在Linux系統上,不在svn的工作副本中,查看指定文件。

4.5、工作副本還原revert

將修改過的文件還原爲與最後一次跟新副本的文件一致(在未添加到版本控制之前),修改的內容是不保存的,也就是將本次的修改不生效,還原到最後一次更新的工作副本

svn revert 文件名           #指定還原文件

svn revert *               #還原當前目錄下的所有文件或目錄

svn revert --resursive *  #遞歸還原當前目錄下的所有文件或目錄

4.6、二進制衝突與樹衝突

二進制衝突:一些代碼文件中具體到某個文件的具體行數

如果開發B在09:20進行一次更新,那就是說,服務器已經默認開發B已經知道了開發A的修改,也就不會報衝突。

樹衝突:發生衝突的文件都不是二進制文本文件

樹衝突無法精確到行,並且處理樹衝突必須處理整個文件,就比如兩個開發人員在不同時間提交了相同圖片名的不同圖片。

處理衝突:

在協商之後處理完成衝突後需要告訴svn衝突已解決,

svn resolved 文件名                #告訴服務器衝突解決完畢,可以正常提交

4.7、鎖定lock與解鎖unlock

鎖定與解鎖就是爲了防止衝突的解決方案

svn lock 文件名      #鎖定文件,防止其他成員對文件進行修改,如果進行提交操作之後,會將該文件自動解鎖

svn commit -m “註釋” --no-unlock 文件名   #對鎖定的該文件提交後,依舊不解鎖。

svn unlock 文件名 #解鎖文件

5、svn的進階應用

5.1、ls、st、log、info

svn list               #列出當前目錄下處於版本控制的所有文件

svn status         #列出工作副本中的文件(夾)的狀態

文件的狀態的含義:

?              #無版本控制

D                #已被標記從版本庫中刪除

M               #已被編輯過

A                #已被標記增加到版本控制中

R                #文件被替換

C                #文件存在衝突

!              #文件缺失

svn log               #查看提交日誌(來自svn commit -m “註釋”)

svn info              #工作副本及文件(夾)的詳細信息

5.2、多版本庫解決方案

TCP/IP協議的標準:

TCP/IP協議規定端口號範圍爲0-65535號

0-1023號爲公認端口

1024-49151號爲註冊端口

49152-65535號爲私有端口

5.1.1、不同端口啓動多個版本庫

在創建完版本庫後,啓動多個版本庫需要指定監聽的端口號

創建版本庫:

進入到svn版本庫的保存目錄下,創建多個版本庫

[root@localhost ~]# cd /usr/local/SvnRepository/ 

#進入到svn版本庫的保存目錄下

[root@localhost SvnRepository]# svnadmin create test01              #創建版本庫test01

[root@localhost SvnRepository]# svnadmin create test02              #創建版本庫test02

[root@localhost SvnRepository]# svnadmin create test03              #創建版本庫test03

[root@localhost SvnRepository]# ls                  #查看創建的版本庫

分別修改版本庫下面的配置文件

authz:配置用戶組合用戶組的權限

passwd:配置用戶名和用戶密碼

svnserve.conf:配置默認權限、權限配置文件及密碼配置文件

指定端口監聽啓動版本庫:

指定端口啓動運行版本庫

[root@localhost SvnRepository]# svnserve -d -r /usr/local/SvnRepository/test01 --listen-port 3691  #指定監聽端口爲3691,啓動版本庫test01

[root@localhost SvnRepository]# svnserve -d -r /usr/local/SvnRepository/test02 --listen-port 3692  #指定監聽端口爲3692,啓動版本庫test02

[root@localhost SvnRepository]# svnserve -d -r /usr/local/SvnRepository/test03 --listen-port 3693  #指定監聽端口爲3693,啓動版本庫test03

[root@localhost SvnRepository]# ps -ef|grep svn       #查看svn的進程端口

這樣,三個新添加的svn版本庫都運行起來了

如果需要停止所得版本庫運行,執行kill svnserve

檢出多個版本庫

svn checkout svn://192.168.244.128:3691 /usr/local/svnwork/test013691

#檢出指定端口監聽的版本庫到指定工作副本中

5.1.2、一個端口啓動多個版本庫

多個版本庫放在同一個目錄下

在啓動運行版本庫時指定運行版本庫的父級目錄,這樣一次就可以運行啓動多個版本庫

[root@localhost SvnRepository]# svnserve -d -r /usr/local/SvnRepository/

檢出的時候需要哪個檢出哪個版本庫就在IP後面加上版本庫的名稱

[root@localhost svnwork]# svn checkout svn://192.168.244.128/testrpo

#指定檢出版本庫testrpo

[root@localhost svnwork]# svn checkout svn://192.168.244.128/testrpo1

#指定檢出版本庫testrpo1

5.3、svn的copy命令

功能:

工作副本à工作副本

svn cp 源文件名稱 目標文件名稱

如果在工作副本中使用svn的copy命令複製的文件,如果複製的源文件有版本控制,則複製完成的目標文件也是有版本控制的,如果是複製的源文件是沒有版本控制的,那麼複製完成的目標文件也是沒有版本控制的,此時需要使用svn的增加和提交命令纔能有版本控制。

svn cp -r 版本號 源文件名 目標文件名

指定複製版本號的文件

工作副本à版本庫

svn cp 源文件名 版本庫服務器地址(目標文件地址) -m “提交註釋”

複製一個工作副本直接提交到版本庫,不支持誇庫操作

此時服務器上的版本庫中有了這個新的文件,版本號會自動加1

版本庫à工作副本

svn cp 版本庫服務器地址(源文件地址) 本地工作副本目標地址

將服務器上版本庫中的文件複製到本地的工作副本中,該操作可以誇庫操作

版本庫à版本庫

svn cp 服務器上源文件地址 服務器上目標地址 -m “提交註釋”

不可誇庫操作,本地的工作副本,直接提交的。

5.4、主幹版本與分支版本

創建分支版本的過程是完全脫離工作副本進行的,使用版本庫到版本庫之間的copy操作,實現主幹和分支。

#複製服務器上的imooc版本庫到服務器上imooc版本庫中的trunk(主幹)目錄下,該目錄下存放的就是原來的所有文件。

#在imooc版本庫中複製一份主幹版本(trunk)到imooc版本庫中作爲分支版本(branch)。

6、svn的高級應用

6.1、hooks鉤子應用

鉤子:當執行某些特定操作時觸發執行預先設定好的任務。

在svn的版本庫中存在文件目錄hooks,裏面有很多的.tmp格式的模板文件,如果需要讓鉤子生效,只需要將對應的文件複製一份,把.tmp這個拓展名去掉,重啓svn服務,就可以啓動這個鉤子了,而鉤子文件就是一個shell腳本,這裏的執行對應任務,就是執行對應的shell腳本,可以在該腳本里面編寫自己需要執行的任何腳本。這些鉤子的前綴有start(數據傳輸開始之前),pre(數據傳輸之後,寫入版本庫之前),post(寫入版本庫之後),後半部分纔是對應的操作名,比如commit、lock、unlock等

例:在svn中每次提交完成以後,調用鉤子函數,利用Apache需要將版本庫的最新信息通過網頁可以直接訪問。

第一步:複製鉤子文件

進入到svn服務器的版本庫中找到hooks目錄

進入hooks目錄

複製一份提交完成後執行的鉤子函數模板在當前hooks文件目錄下,只需要將文件名的拓展名去掉。

查看鉤子文件post-commit的權限,如果沒有權限需要賦予執行權限

[root@localhost hooks]# ll

沒有執行權限需要加上執行權限

[root@localhost hooks]# chmod +x post-commit

#添加文件的執行權限

第二步、編寫鉤子函數腳本

使用編輯器打開該鉤子腳本post-commit進行編輯

[root@localhost hooks]# vi post-commit

寫入shell腳本函數

如果使自己寫的shell腳本,可以去掉該鉤子文件的最後幾行後

編寫需要執行的腳本

在每次提交完成後,每次需要將最新的版本庫的詳細信息保存成一個xml文件,放到Apache的目錄下,用戶可以通過網頁瀏覽版本庫的詳細信息。

svn info svn://192.168.244.128 --xml >> /var/www/html/repo.xml

編輯完成,保存退出

第三步、重啓svn服務

[root@localhost hooks]# ps -ef|grep svn                 #查看svn的進程

[root@localhost hooks]# kill -9 2155                #殺死進程

[root@localhost hooks]# svnserve -d -r /usr/local/SvnRepository/testrpo              #啓動svn服務

第四步、測試

在工作副本中進行一次提交操作

配置Apache默認訪問地址

[root@localhost ~]# cd /etc/httpd/conf.d/

[root@localhost conf.d]# ls

[root@localhost conf.d]# vi welcome.conf

配置完成,保存退出,重啓Apache

[root@localhost conf.d]# service httpd stop            #停止Apache服務

[root@localhost conf.d]# service httpd start           #啓動Apache服務

打開瀏覽器訪問svn鉤子生成的xml文件

http://192.168.244.128/repo.xml

6.2、版本庫精簡

版本庫的精簡也就是說把之前的老舊的一些版本號丟掉,達到精簡的目的。

[root@localhost svnwork]# svn info                 #查看當前的最大版本號

現在需要丟棄版本1到版本3,只留版本4到版本6

首先停止svn的服務

[root@localhost svnwork]# ps -ef|grep svn

[root@localhost svnwork]# kill -9 2487

把需要保留的版本數據備份出來

[root@localhost svnwork]# svnadmin dump /usr/local/SvnRepository/testrpo -r 4:6 > ~/testrpo.repo

#將版本庫/usr/local/SvnRepository/testrpo的4到6的版本備份到用戶目錄下的testrpo.repo

這裏的版本庫一定要寫版本庫文件系統的路徑

備份成功

創建新的版本庫,將備份的版本庫加載進去

[root@localhost SvnRepository]# svnadmin create /usr/local/SvnRepository/newrepo

#創建新的版本庫

將備份的版本庫加載到新創建的版本庫中

[root@localhost SvnRepository]# svnadmin load /usr/local/SvnRepository/newrepo/ < ~/testrpo.repo

#將備份的版本庫~/testrpo.repo加載到新創建的版本庫/usr/local/SvnRepository/newrepo/

版本庫精簡過後,它的版本號依然是從1開始的,它會將丟棄的版本號一次填充進來,但不填充數據。原來的版本4,現在變成了1,原來的版本號6,變爲現在的版本號3.

將原來的配置文件複製到新的版本庫的目錄下

[root@localhost SvnRepository]# cp -av /usr/local/SvnRepository/testrpo/conf/* /usr/local/SvnRepository/newrepo/conf/

現在局可以將原來的版本庫刪掉了。

svn啓動運行新的版本庫

[root@localhost SvnRepository]# svnserve -d -r /usr/local/SvnRepository/newrepo/

在做了版本精簡操作後原來的工作副本不能夠正常使用,因爲版本號已經對應不上了,所以需要重新檢出一份才能夠進行操作。

6.3、版本庫的遷移與重定向

6.3.1、版本庫的遷移

通常是服務器更換了,我們需要把數據遷移到新的服務器上。

第一種方法:

可以用版本庫精簡的方法,需要備份的文件充0到最新的版本號,再將備份文件複製到新的服務騎上,創建版本庫後,在加載到新建的版本庫。

第二種方法:

①停止svn版本庫的服務

ps -ef|grep svn         #查詢svn的進程

kill -9 進程ID          #關閉svn的服務

②把版本庫壓縮成.zip文件

③複製壓縮文件到新的服務器上解壓

④在新的服務器上啓動運行解壓的這個版本庫

6.3.2、版本庫的重定向

遷移了數據以後,需要在工作副本中將原來的服務器地址切換成新的服務器地址(也就是版本庫的重定向)

重定向的命令:

svn switch --relocat 原來的URL 新的URL

這樣就能夠重定向工作副本的地址

7、svn常見的坑

1、創建完版本庫之後忘記修改svnserve.conf文件

svnserve.conf文件,路徑爲創建的版本庫的目錄下的conf目錄下,需要在這個文件中指定每個配置文件的位置。

2、運行版本庫的路徑問題

在啓動運行svn服務的時候,如果沒有寫版本庫的名稱,在檢出時的URL後面一定需要跟上版本庫的名稱,也就是說運行的時候沒有寫,檢出的時候就必須寫,運行時寫了,檢出時就不用寫

3、svnadmin dump/load 管道符號的問題

備份的時候是大於號(>),加載的時候是小於號(<),如果在加載的時候寫錯了管道符號,數據會被覆蓋,相當於備份的數據被覆蓋刪除了,只要寫錯一次備份的數據就沒了。

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章