一. 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
[[email protected] ~]# 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!
[[email protected] ~]#
驗證安裝版本:
[[email protected] ~]# 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 版本庫
[[email protected] ~]# mkdir /u02/svn
[[email protected] ~]# svnadmin create /u02/svn/davesvn --davesvn為版本庫名稱
2.3 SVN 配置
建立版本庫後,在這個目錄下會生成3個配置檔案:
[[email protected] conf]# pwd
/u02/svn/davesvn/conf
[[email protected] 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檔案裡啟用這個檔案。然後配置如下:
[[email protected] 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檔案:
[[email protected] conf]# cat authz
[groups]
admin = dave
dev=tianlesoftware
[davesvn:/]
@admin = rw
@dev = rw
[[email protected] conf]#
修改svnserve.conf(重要)
vi svnserve.conf
原始檔案内容,都被注釋掉的,我們隻需要去掉4條指定内容前注釋即可,如下:

大多數網絡資料,都會讓大家将authz-db = authz這條給去掉注釋,經過我本人多次被坑經驗,此條去掉後,雖然svn伺服器可以連接配接,但一直會提示“認證失敗”,注釋掉即可正常
還有多數資料會讓大家在realm = My First Repository處填寫伺服器ip,經過測試,填寫後并無什麼用處,是以大家去掉注釋即可,無需做任何修改
到此,配置已經全部完成,賬号資訊已經添加成功
第五步:防火牆開啟
多數情況下伺服器安裝完成,配置完成後,無法連接配接svn伺服器,均是防火牆問題,大家按照如下3條指令逐一執行即可
>/sbin/iptables -I INPUT -p tcp --dport 3690 -j ACCEPT
>/etc/init.d/iptables save
>service iptables restart
執行結果如下圖:
六:啟動svn伺服器
在跟目錄下,執行如下指令:
>svnserve -d -r /u02/svn
-d表示背景運作
-r 指定根目錄是 /u02/svn
啟動成功後,可用ps -aux檢視服務啟動是否成功
七:用戶端通路svn伺服器
在windows用戶端,輸入位址:svn://ip位址:3690/xxxx (iP位址為你linux的ip,xxxx為前文建立的版本庫名稱,3690為svn預設端口)
彈出輸入使用者名和密碼,輸入即可通路
到此,Linux下svn伺服器搭建就總結完畢,感謝大家的閱讀
如果此文有幫助到你,請幫忙推廣
注: 本文章轉自 http://www.cnblogs.com/mymelon/p/5483215.html