對(duì)互聯(lián)網(wǎng)公司而言,SVN的重要性不言而喻。本文選用CollabNet Subversion Edge作為SVN服務(wù)端和控制臺(tái),以TortoiseSVN作為客戶端部署SVN系統(tǒng)。CollabNet Subversion Edge控制臺(tái)功能十分強(qiáng)大,便于維護(hù)管理,且能采用LDAP認(rèn)證方式,適合部署了內(nèi)部域控的組織。而TortoiseSVN客戶端的功能和性能有口皆碑,無(wú)需贅述。
一. 準(zhǔn)備工作
- 虛擬機(jī)準(zhǔn)備
部署一臺(tái)Windows 虛擬機(jī),關(guān)閉防火墻。假設(shè)ip為10.10.10.100,已在域控制器為其做了域名解析,主機(jī)名為 devint-svn.xzz.com。 - 軟件準(zhǔn)備
jdk(前往官網(wǎng));
CollabNet Subversion Edge(前往官網(wǎng));
TortoiseSVN客戶端(前往官網(wǎng))。
二. 安裝SVN服務(wù)器
- 安裝jdk
在虛擬機(jī)中安裝jdk,完成后配置環(huán)境變量JAVA_HOME、PATH、CLASSPATH,然后可以用一個(gè)簡(jiǎn)單的java程序測(cè)試是否配置正確。安裝配置成功后進(jìn)行下一步。 - 安裝CollabNet Subversion Edge
在虛擬機(jī)中運(yùn)行CollabNet Subversion Edge安裝程序,默認(rèn)安裝至完成。安裝完成后,可以在開(kāi)始菜單里看到CollabNet Subversion Edge 快捷方式,點(diǎn)擊后進(jìn)入控制面板登陸頁(yè)面,說(shuō)明安裝成功。

三. 配置SVN服務(wù)器
- 配置CollabNet Subversion 服務(wù)為自動(dòng)啟動(dòng)
在Services配置CollabNet Subversion Edge和CollabNet Subversion Server兩個(gè)服務(wù)為自動(dòng)啟動(dòng)。

更改默認(rèn)管理員密碼
在域內(nèi)任何一臺(tái)計(jì)算機(jī)上打開(kāi)SVN控制臺(tái) [ https://devint-svn.xzz.com/csvn ],以默認(rèn)管理員admin(默認(rèn)密碼admin)登錄,點(diǎn)擊右上角Super Administrator(admin)鏈接,在編輯->修改密碼里修改默認(rèn)管理員密碼。-
服務(wù)器設(shè)置
在“管理”面板里點(diǎn)擊“Server Settings”,如下圖所示設(shè)置服務(wù)器的主機(jī)名、端口、版本庫(kù)父文件夾、備份文件夾,勾選控制臺(tái)加密,點(diǎn)擊保存。

-
認(rèn)證設(shè)置
在“管理”標(biāo)簽下點(diǎn)擊“Authentication”,配置用戶認(rèn)證,如下圖所示。在認(rèn)證方法勾選“使用htpasswd文件的本地認(rèn)證以及其它認(rèn)證方法”和“用LDAP服務(wù)器進(jìn)行LDAP認(rèn)證”,然后配置LDAP。按照下圖所示配置完成后點(diǎn)擊保存。
新建一個(gè)超級(jí)用戶
在“用戶”標(biāo)簽下點(diǎn)擊“用戶列表”,點(diǎn)擊“創(chuàng)建”按鈕新建一個(gè)超級(jí)用戶。

四. 測(cè)試SVN服務(wù)器
-
創(chuàng)建測(cè)試用版本庫(kù)
創(chuàng)建一個(gè)版本庫(kù)用于測(cè)試。在“版本庫(kù)”標(biāo)簽下點(diǎn)擊“版本庫(kù)列表”,點(diǎn)擊“創(chuàng)建”按鈕,新建一個(gè)名為“cafescribe_admin”的版本庫(kù),勾選“使用模板”和“Create standard trunk/branches/tags structure”,如下圖所示。點(diǎn)擊“創(chuàng)建”。
創(chuàng)建完成后可以再版本庫(kù)列表看到新建的版本庫(kù)。
創(chuàng)建版本庫(kù)后,在“版本庫(kù)”標(biāo)簽下點(diǎn)擊“訪問(wèn)規(guī)則”,編輯對(duì)這個(gè)版本庫(kù)根目錄和新版本庫(kù)的訪問(wèn)規(guī)則。為了便于測(cè)試,授予所有用戶讀寫(xiě)權(quán)限。
本地用戶訪問(wèn)測(cè)試
在一臺(tái)安裝了TortoiseSVN客戶端的機(jī)子上,打開(kāi)“TortoiseSVN Repository Browser”,在跳出的地址框里輸入版本庫(kù)url http://devint-svn.xzz.com/svn/cafescribe_admin :

點(diǎn)擊“OK”,在跳出的登陸框里輸入用戶名“admin”及其密碼,按回車(chē)鍵登錄。

可以發(fā)現(xiàn)成功登錄版本庫(kù)。

- 域用戶登錄測(cè)試
同樣的,用域賬號(hào)訪問(wèn)此版本庫(kù),也可以成功登錄。


-
Checkout 測(cè)試
右鍵->“SVN Checkout”,打開(kāi)版本庫(kù)檢出窗口。
輸入版本庫(kù)url和檢出目錄,點(diǎn)擊“OK”,在彈出的認(rèn)證框里輸入域賬號(hào)及其密碼,點(diǎn)擊“OK”,開(kāi)始檢出版本庫(kù)。

檢出成功。

可以發(fā)現(xiàn)目標(biāo)版本庫(kù)被成功檢出到目標(biāo)文件夾里。
五. 其他重要配置
-
控制后臺(tái)權(quán)限控制
前文已經(jīng)配置了版本庫(kù)的認(rèn)證,包括CollabNet Subversion Edge 本地用戶認(rèn)證和 LDAP 用戶認(rèn)證。CollabNet Subversion Edge系統(tǒng)里創(chuàng)建的本地用戶暫且不論,LDAP用戶登錄系統(tǒng)后臺(tái)時(shí)會(huì)留下一條LDAP用戶記錄(沒(méi)有登陸過(guò)管理后臺(tái)則沒(méi)有),然后才可以修改該用戶的角色。
以超級(jí)管理員賬號(hào)登錄后臺(tái),點(diǎn)擊用戶->用戶列表:
可以看到一些LDAP用戶登陸過(guò)系統(tǒng)管理后臺(tái),點(diǎn)擊角色列表,可以看到系統(tǒng)已經(jīng)定義好的角色:

點(diǎn)擊角色名可以將該角色授予用戶:
![]DFNIM.png](http://upload-images.jianshu.io/upload_images/4954542-90325a22ad0fe4f1.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
-
版本庫(kù)讀寫(xiě)權(quán)限控制
組織中大多有多個(gè)項(xiàng)目,可以在SVN管理后臺(tái)針對(duì)每個(gè)項(xiàng)目分別配置用戶的讀寫(xiě)權(quán)限。
針對(duì)項(xiàng)目的權(quán)限控制在CollabNet Subversion Edge 的 版本庫(kù)->訪問(wèn)規(guī)則頁(yè)面進(jìn)行,下圖是針對(duì)一個(gè)FOO項(xiàng)目的訪問(wèn)控制例子:
首先對(duì)用戶進(jìn)行分組,例如IT管理組、架構(gòu)師組、QA組,以及各個(gè)項(xiàng)目的用戶組等等,以便進(jìn)行分組控制。其中項(xiàng)目組中可以劃分完全控制(及可讀寫(xiě))以及只讀用戶組,以分配不同的權(quán)限。
Hook Script
可以利用鉤子腳本對(duì)版本庫(kù)進(jìn)行一些附加的操作,比如在commit時(shí)執(zhí)行檢查,如果用戶未對(duì)本次commit進(jìn)行說(shuō)明,則拒絕commit。以下是此鉤子的例子:
<p><code>
@echo off
setlocal
set REPOS=%1
set TXN=%2
rem check that logmessage contains at least 5_characters
svnlook log "%REPOS%" -t "%TXN%" | findstr ".." > nul
if %errorlevel% gtr 0 goto err
exit 0
:err
echo 至少需要輸入2個(gè)字符及以上的評(píng)論, 請(qǐng)修改后重新提交! 1>&2
exit 1
</code></p>
六. TortoiseSVN客戶端簡(jiǎn)明教程
TortoiseSVN是windows下一個(gè)非常優(yōu)秀的SVN客戶端工具,通過(guò)它我們可以可視化的管理我們的版本庫(kù)。不過(guò)由于它只是一個(gè)客戶端,所以它不能對(duì)版本庫(kù)進(jìn)行權(quán)限管理。
安裝時(shí)按默認(rèn)步驟安裝即可,無(wú)需詳述。
TortoiseSVN不是一個(gè)獨(dú)立的窗口程序,而是集成在windows右鍵菜單中,使用起來(lái)比較方便。以下簡(jiǎn)要說(shuō)明TortoiseSVN的每個(gè)菜單項(xiàng)如何使用。
1. SVN Checkout(檢出版本庫(kù))
點(diǎn)擊SVN Checkout,彈出檢出提示框,在URL of repository輸入框中輸入目標(biāo)版本庫(kù)地址,在Checkout directory輸入框中輸入本地工作拷貝的路徑,點(diǎn)擊確定,即可檢出服務(wù)器上的版本庫(kù)。
2. SVN Update(更新版本庫(kù))
如果版本庫(kù)在本地已有工作拷貝,則取得最新版本只是執(zhí)行SVN Update即可,點(diǎn)擊SVN Update,系統(tǒng)彈出更新提示框,點(diǎn)擊確定,則把服務(wù)器上的最新版本更新下來(lái)。
3. SVN Commit(版本提交)
把自己工作拷貝所做的修改提交到版本庫(kù)中,這樣別人在獲取最新版本(Update)的時(shí)候就可以看到你的修改了。
4. Show log(顯示日志)
顯示當(dāng)前文件(夾)的所有修改歷史。SVN支持文件以及文件夾獨(dú)立的版本追溯。
5. Repo-Browser(查看當(dāng)前版本庫(kù))
查看當(dāng)前版本庫(kù),這是TortoiseSVN查看版本庫(kù)的入口,通過(guò)這個(gè)菜單項(xiàng),我們就可以進(jìn)入配置庫(kù)的資源管理器,然后就可以對(duì)配置庫(kù)的文件夾進(jìn)行各種管理,相當(dāng)于我們打開(kāi)我的電腦進(jìn)行文件管理一樣。
6. Check for Modifications(檢查更新)
點(diǎn)擊Check for Modifications,彈出一個(gè)列出所有待更新的文件及文件夾的狀態(tài)的窗口。
7. Revision Graph(版本分支圖)
查看文件的版本分支結(jié)構(gòu),可以點(diǎn)擊Revision Graph,系統(tǒng)以圖形化形式顯示版本分支。
8. Update to Revision(更新至某個(gè)版本)
從版本庫(kù)中獲取某一個(gè)歷史版本。這個(gè)功能主要是方便查看歷史版本用,而不是回滾版本。注意:獲取下來(lái)之后,對(duì)這個(gè)文件不建議進(jìn)行任何操作。
如果你做了修改,那么當(dāng)你提交的時(shí)候SVN會(huì)提示你,當(dāng)前版本已失效(即不是最新版本),無(wú)法提交,需要先update一下。這樣你所做的修改也就白費(fèi)了。
9. Revert(回滾)
如果你對(duì)工作拷貝做了一些修改,但是你又不想要了,那么你可以使用這個(gè)選項(xiàng)把所做的修改撤銷(xiāo)。
10. Clean up(清除狀態(tài))
如果當(dāng)前工作拷貝有任何問(wèn)題的話,可以使用這個(gè)選項(xiàng)進(jìn)行修正。例如,有些文件原來(lái)是版本控制的,但是你沒(méi)有通過(guò)tortoiseSVN就直接刪除了,但是tortoiseSVN還是保留著原來(lái)的信息(每個(gè)文件夾下都有一個(gè).svn的隱藏文件夾,存放著當(dāng)前文件夾下所有文件夾的版本信息)所以這就會(huì)產(chǎn)生一些沖突。可以使用cleanup來(lái)清理一下。
11. GetLock/ReleaseLock(加鎖/解鎖)
如果你不想別人修改某個(gè)文件的話,那么你就可以把這個(gè)文件進(jìn)行加鎖,這樣可以保證只有你對(duì)這個(gè)文件有修改權(quán)。除非你釋放了鎖,否則別人不可能提交任何修改到配置庫(kù)中。
12. Branch/tag(分支/標(biāo)簽)
Branch是分支的意思。例如當(dāng)在設(shè)計(jì)一個(gè)東西的時(shí)候,不同的人有不同的實(shí)現(xiàn),但是沒(méi)有經(jīng)過(guò)實(shí)踐檢驗(yàn),誰(shuí)也不想直接覆蓋掉其他人的設(shè)計(jì),所以可以引出不同的分支。將來(lái)如果需要,可以將這些分支進(jìn)行合并。
tag是打標(biāo)簽的意思。通常當(dāng)項(xiàng)目開(kāi)發(fā)到一定程度,已經(jīng)可以穩(wěn)定運(yùn)行的時(shí)候,可以對(duì)其打上一個(gè)標(biāo)簽,作為穩(wěn)定版。將來(lái)可以方便的找到某個(gè)特定的版本(當(dāng)然我們也可以使用版本號(hào)來(lái)查找,但是數(shù)字畢竟不方便)。
SVN對(duì)于分支和標(biāo)簽都是采用類(lèi)似Linux下硬鏈接的方式(同一個(gè)文件可以存在兩個(gè)地方,刪除一個(gè)不會(huì)影響另一個(gè),所做修改會(huì)影響另一個(gè)),來(lái)管理文件的,而不是簡(jiǎn)單的復(fù)制一份文件的拷貝,所以不會(huì)有浪費(fèi)存儲(chǔ)空間的問(wèn)題存在。
13. Switch(切換)
文件創(chuàng)建分支后,你可以選擇在主干工作,還是在分支工作,這時(shí)候你可以通過(guò)Switch來(lái)切換。
14. Merge(合并)
主干和分支的版本進(jìn)行合并,在源和目的各輸入文件的路徑,版本號(hào),點(diǎn)擊確定。系統(tǒng)即對(duì)文件進(jìn)行合并,如果存在沖突,請(qǐng)參考沖突解決。
15. Export(導(dǎo)出)
把整個(gè)工作拷貝導(dǎo)出到本地目錄下,導(dǎo)出的文件將不帶svn文件標(biāo)志,文件及文件夾沒(méi)有綠色的”√”符號(hào)標(biāo)志。這個(gè)功能是方便我們部署用。
當(dāng)我們需要發(fā)布一個(gè)穩(wěn)定版本時(shí),就可以使用這個(gè)功能將整個(gè)工程導(dǎo)出到某個(gè)文件夾,新的文件夾將不會(huì)包含任何版本信息了。
16. Relocate(重新定位)
當(dāng)服務(wù)器上的文件庫(kù)目錄已經(jīng)改變,我們可以把工作拷貝重新定位,在To URL輸入框中輸入新的地址。
當(dāng)我們版本庫(kù)發(fā)生轉(zhuǎn)移的時(shí)候就需要用到這個(gè)功能了。例如原先的版本庫(kù)是建在U盤(pán)上的,現(xiàn)在轉(zhuǎn)移到(復(fù)制整個(gè)配置庫(kù)文件夾)開(kāi)發(fā)服務(wù)器上,使用https代替文件系統(tǒng)的訪問(wèn)。因此就需要將原來(lái)的工作拷貝的目標(biāo)版本庫(kù)重新定位到開(kāi)發(fā)服務(wù)器上。
17. Import(導(dǎo)入)
選擇要提交到服務(wù)器的目錄,右鍵選擇TortoiseSVN->Import,系統(tǒng)彈出導(dǎo)入提示框,在URL of repository輸入框中輸入服務(wù)器倉(cāng)庫(kù)地址,在Import Message輸入框中輸入導(dǎo)入日志信息,點(diǎn)擊確定,則文件導(dǎo)入到服務(wù)器倉(cāng)庫(kù)中。
18. Add(加入)
如果有多個(gè)文件及文件夾要提交到服務(wù)器,我們可以先把這些要提交的文件加入到提交列表中,要執(zhí)行提交操作,點(diǎn)擊執(zhí)行提交(SVN Commit),即可把所有文件一次性提交到服務(wù)器上。
19. Create patch/Apply patch(創(chuàng)建/發(fā)布補(bǔ)?。?/h6>
創(chuàng)建/發(fā)布補(bǔ)丁。如果管理員不想讓任何人都隨便提交修改,而是都要經(jīng)過(guò)審核才能做出修改,那么其他人就可以通過(guò)創(chuàng)建補(bǔ)丁的方式,把修改信息(補(bǔ)丁文件)發(fā)送給管理員,管理員審核通過(guò)之后就可以使用apply patch提交這次修改了。
20. Unversion and add to Ignore List(取消版本控制并添加到忽略列表)
大多數(shù)項(xiàng)目會(huì)有一些文件(夾)不需要版本控制,如編譯產(chǎn)生的*.obj, *.lst,等。這時(shí)候可以把這些文件加入忽略列表。








