一. SVN?簡介
Subversion(SVN)?是一個開源的版本控制系統,?也就是說?Subversion?管理著隨時間改變的數據。?這些數據放置在一個中央資料檔案庫?(repository)?中。?這個檔案庫很像一個普通的文件服務器,?不過它會記住每一次文件的變動。?這樣你就可以把檔案恢復到舊的版本,?或是瀏覽文件的變動歷史。
SVN中的一些概念?:
(1). repository(源代碼庫)
源代碼統一存放的地方
(2). Checkout?(提取)
當你手上沒有源代碼的時候,你需要從repository checkout一份
(3). Commit?(提交)
當你已經修改了代碼,你就需要Commit到repository
(4). Update (更新)
當你已經Checkout了一份源代碼,?Update一下你就可以和Repository上的源代碼同步,你手上的代碼就會有最新的變更
日常開發過程其實就是這樣的(假設你已經Checkout并且已經工作了幾天):Update(獲得最新的代碼) -->作出自己的修改并調試成功?--> Commit(大家就可以看到你的修改了)?。
如果兩個程序員同時修改了同一個文件呢,??SVN可以合并這兩個程序員的改動,實際上SVN管理源代碼是以行為單位的,就是說兩個程序員只要不是修改了同一行程序,SVN都會自動合并兩種修改。如果是同一行,SVN會提示文件Confict,?沖突,需要手動確認。
客戶端軟件:
(1)Windows下常用的客戶端軟件常用TortoiseSVN。它是一個免費的開源的客戶端。?下載地址:http://tortoisesvn.net/downloads.html
(2)向Myeclipse,也有一些SVN的插件。
Subversion提供以下主要功能:
(1)目錄版本控制
CVS?只能跟蹤單個文件的歷史,?不過?Subversion?實作了一個?“虛擬”?的版本控管文件系統,?能夠依時間跟蹤整個目錄的變動。?目錄和文件都能進行版本控制。
(2)真實的版本歷史
自從CVS限制了文件的版本記錄,CVS并不支持那些可能發生在文件上,但會影響所在目錄內容的操作,如同復制和重命名。除此之外,在CVS里你不能用擁有同樣名字但是沒有繼承老版本歷史或者根本沒有關系的文件替換一個已經納入系統的文件。在Subversion中,你可以增加(add)、刪除(delete)、復制(copy)和重命名(rename),無論是文件還是目錄。所有的新加的文件都從一個新的、干凈的版本開始。
(3)自動提交
一個提交動作,不是全部更新到了檔案庫中,就是完全不更新。這允許開發人員以邏輯區間建立并提交變動,以防止當部分提交成功時出現的問題。
(4)納入版本控管的元數據
每一個文件與目錄都附有一組屬性關鍵字并和屬性值相關聯。你可以創建,?并儲存任何你想要的Key/Value對。?屬性是隨著時間來作版本控管的,?就像文件內容一樣。
(5)選擇不同的網絡層
Subversion?有抽象的檔案庫存取概念,?可以讓人很容易地實作新的網絡機制。?Subversion?可以作為一個擴展模塊嵌入到Apache HTTP?服務器中。這個為Subversion提供了非常先進的穩定性和協同工作能力,除此之外還提供了許多重要功能:?舉例來說,?有身份認證,?授權,?在線壓縮,?以及文件庫瀏覽等等。還有一個輕量級的獨立Subversion服務器,?使用的是自定義的通信協議,?可以很容易地通過?ssh?以?tunnel?方式使用。
(6)一致的數據處理方式
Subversion?使用二進制差異算法來異表示文件的差異,?它對文字(人類可理解的)與二進制文件(人類無法理解的)?兩類的文件都一視同仁。?這兩類的文件都同樣地以壓縮形式儲存在檔案庫中,?而且文件差異是以兩個方向在網絡上傳輸的。
(7)有效的分支(branch)與標簽(tag)
在分支與標簽上的消耗并不必一定要與項目大小成正比。?Subversion?建立分支與標簽的方法,?就只是復制該項目,?使用的方法就類似于硬連接(hard-link)。所以這些操作只會花費很小,?而且是固定的時間。
(8)Hackability
Subversion沒有任何的歷史包袱;?它主要是一群共用的?C?程序庫,?具有定義完善的API。這使得?Subversion?便于維護,?并且可被其它應用程序與程序語言使用。
二.??SVN?服務器搭建
2.1?使用yum?安裝SVN包
關于YUM?服務器的配置參考:
Linux?搭建?YUM?服務器
http://blog.csdn.net/tianlesoftware/archive/2011/01/03/6113902.aspx
[root@singledb ~]# yum install -y subversion
Loaded plugins: rhnplugin, security
This system is not registered with RHN.
RHN support will be disabled.
Setting up Install Process
Resolving Dependencies
--> Running transaction check
---> Package subversion.i386 0:1.4.2-4.el5_3.1 set to be updated
--> Finished Dependency Resolution
Dependencies Resolved
====================================================================================================
Package????????????????Arch?????????????Version????????????????????????Repository?????????????Size
====================================================================================================
Installing:
subversion?????????????i386?????????????1.4.2-4.el5_3.1????????????????rhel-base?????????????2.3 M
Transaction Summary
====================================================================================================
Install??????1 Package(s)
Update???????0 Package(s)
Remove???????0 Package(s)
Total download size: 2.3 M
Downloading Packages:
subversion-1.4.2-4.el5_3.1.i386.rpm??????????????????????????????????????????| 2.3 MB?????00:00
Running rpm_check_debug
Running Transaction Test
Finished Transaction Test
Transaction Test Succeeded
Running Transaction
Installing?????: subversion???????????????????????????????????????????????????????????????????1/1
Installed:
subversion.i386 0:1.4.2-4.el5_3.1
Complete!
[root@singledb ~]#
驗證安裝版本:
[root@singledb ~]#?svnserve --version
svnserve, version 1.4.2 (r22196)
compiled Aug??5 2009, 19:03:56
Copyright (C) 2000-2006 CollabNet.
Subversion is open source software, see http://subversion.tigris.org/
This product includes software developed by CollabNet (http://www.Collab.Net/).
The following repository back-end (FS) modules are available:
* fs_base : Module for working with a Berkeley DB repository.
* fs_fs : Module for working with a plain file (FSFS) repository.
2.2?創建SVN?版本庫
[root@singledb ~]# mkdir /u02/svn
[root@singledb ~]# svnadmin create /u02/svn/davesvn??--davesvn為版本庫名稱
2.3??SVN?配置
創建版本庫后,在這個目錄下會生成3個配置文件:
[root@singledb conf]# pwd
/u02/svn/davesvn/conf
[root@singledb conf]# ls
authz??passwd??svnserve.conf
(1)svnserve.conf:? svn服務配置文件下。
(2)passwd:?用戶名口令文件。
(3)authz:?權限配置文件。
svnserve.conf?文件,?該文件配置項分為以下5項:
anon-access:?控制非鑒權用戶訪問版本庫的權限。
auth-access:??控制鑒權用戶訪問版本庫的權限。
password-db:?指定用戶名口令文件名。
authz-db:指定權限配置文件名,通過該文件可以實現以路徑為基礎的訪問控制。
realm:指定版本庫的認證域,即在登錄時提示的認證域名稱。若兩個版本庫的認證域相同,建議使用相同的用戶名口令數據文件
Passwd?文件?:
我們在svnserve.conf文件里啟用這個文件。然后配置如下:
[root@singledb conf]# cat passwd
### This file is an example password file for svnserve.
### Its format is similar to that of svnserve.conf. As shown in the
### example below it contains one section labelled [users].
### The name and password for each user follow, one account per line.
[users]
# harry = harryssecret
# sally = sallyssecret
dave = davepwd
tianlesoftware = tianlesoftwarepwd
authz??文件?:
在網上找到一個很好的配置例子:
[groups]
admin = john, kate
devteam1 = john, rachel, sally
devteam2 = kate, peter, mark
docs = bob, jane, mike
training = zak
--這里把不同用戶放到不同的組里面,下面在設置目錄訪問權限的時候,用目錄來操作就可以了。
#?為所有庫指定默認訪問規則
#?所有人可以讀,管理員可以寫,危險分子沒有任何權限
[/]??--對應我測試里的:/u02/svn?目錄
* = r
@admin = rw
dangerman =
#?允許開發人員可以完全訪問他們的項目版本庫
[proj1:/]
@devteam1 = rw
[proj2:/]
@devteam2 = rw
[bigproj:/]
@devteam1 = rw
@devteam2 = rw
trevor = rw
#?文檔編寫人員對所有的docs目錄有寫權限
[/trunk/doc]
@docs = rw
#?培訓人員可以完全訪問培訓版本庫
[TrainingRepos:/]
@training = rw
下面我們來配置我們的authz文件:
[root@singledb conf]# cat authz
[groups]
admin = dave
dev=tianlesoftware
[davesvn:/]
@admin = rw
@dev = rw
[root@singledb conf]#
2.4?啟動和停止SVN服務
(1)啟動SVN服務:
[root@singledb conf]#?svnserve -d -r /u02/svn
-d表示后臺運行
-r?指定根目錄是?/u02/svn
[root@singledb conf]#?ps -ef | grep svn
root??????4592?????1??0 18:04 ?????????00:00:00 svnserve -d -r /u02/svn
root??????4594??3709??0 18:04 pts/1????00:00:00 grep svn
(2)停止SVN服務:
ps -aux |grep svn
kill -9?進程殺掉
三.?客戶端連接SVN?服務器
3.1?安裝TortoiseSVN?客戶端
下載地址在第一節已說明。
3.2?找到自己項目的目錄,右擊,進行SVN?操作
(1)新建測試目錄svn,進入后右鍵,點checkout:
SVN?服務器的IP地址和版本庫名稱。
新建個文件svn.txt. 把這個文件上傳到SVN服務器(add):