摘要
本文提供一個(gè)簡易的安裝指南,說明在 Windows 環(huán)境下安裝 Subversion 伺服器的步驟,以及 TortoiseSVN 用戶端工具的安裝步驟。
1 簡介
Subversion 是一個(gè)版本控制系統(tǒng),它是根據(jù) CVS(Concurrent Versions System)的功能為基礎(chǔ)來設(shè)計(jì),但是改進(jìn)了一些 CVS 的缺點(diǎn),例如:在 CVS 中搬移檔案目錄很不方便,Subverion 則連目錄的異動(dòng)都納入版本管理;此外,它也增加了其他的功能,例如:不可分割的送交(如同資料庫交易的概念,送交多個(gè)檔案時(shí),若有任何一個(gè)檔案失敗,則這次送交的所有檔案都不會(huì)進(jìn)入檔案庫中)、支援多種網(wǎng)路協(xié)定、一致的檔案差異比對(duì)(不管什麼檔案類型,均使用二進(jìn)位差異比對(duì)方式)....等等。
由於目前手邊查到的 Subversion 文件,主要都是針對(duì) Linux 用戶來撰寫,所以這份文件特地針對(duì) Windows 環(huán)境下安裝 Subversion 的步驟來說明,希望透過這份文件,能夠幫助你很快的把 Subversion 安裝起來。
在安裝過程中,會(huì)需要輸入一些命令列的指令,我不會(huì)詳細(xì)解釋某些指令的用途和意義,因此你除了要熟悉 DOS 的基本指令,還應(yīng)該隨時(shí)查閱 Subversion 的電子書(有中文版),以了解 Subverion 命令列工具的使用方法。圖形化介面雖然方便,但是熟悉命令列工具的使用,才能讓你得到完全的自由。
1.1 閱讀基本觀念
如果你缺乏版本控制系統(tǒng)的基本觀念,就算能夠順利安裝好 Subversion,可能安裝完成後就不知道下一步怎麼做了。這裡只簡單的提一點(diǎn)必要的基礎(chǔ)觀念,記住你最終還是得閱讀 Subversion 的官方文件。
1.2 作業(yè)環(huán)境與軟體版本
以下是筆者安裝 Subverion 的作業(yè)環(huán)境與軟體版本:
- Windows 2000 Server with SP4
- Apache HTTP Server v2.0.50
- Subversion v1.0.5
- TortoiseSVN 1.0.6 build 1200
2 安裝與建立 Subversion 伺服器
本節(jié)介紹安裝 Subversion 所需的步驟,請(qǐng)準(zhǔn)備一臺(tái)穩(wěn)定的機(jī)器,作為 Subversion 的伺服器。
2.1 安裝 Apache HTTP Server
到 http://httpd.apache.org 下載 Apache HTTP Server 2.0 版 for Windows 的安裝程式,我下載的檔案是 apache_2.0.50-win32-x86-no_ssl.msi。
下載之後直接安裝,安裝過程很簡單,就不贅述了,但安裝之前請(qǐng)先檢查你的電腦是否有安裝 IIS,由於 Apache 預(yù)設(shè)使用 80 port,會(huì)跟 IIS 的網(wǎng)站衝突,你必須把 IIS 的 Web 站臺(tái)關(guān)閉,再安裝 Apache HTTP Server。
安裝完成以後,開啟瀏覽器,瀏覽網(wǎng)址 http://127.0.0.1 看看有沒有出現(xiàn)安裝成功的網(wǎng)頁。
2.2 安裝 Subversion
- 到 http://subversion.tigris.org/ 下載最新版的 Subversion,你可以下載 .zip 或者打包好的自動(dòng)安裝程式,我下載的是檔案 svn-1.0.5-setup.exe。
- 下載後直接安裝,安裝過程都是下一步,沒什麼特別的。安裝完成後,連必要的環(huán)境變數(shù)都幫你設(shè)定好了(如果你下載的是 .zip 檔,就要自行設(shè)定)。
- 把 /httpd/ 目錄下的 mod_dav_svn.so 和 mod_authz_svn.so 複製到 /modules/ 目錄下。
- 把 /bin/ 目錄下的 libdb42.dll、libeay32.dll、以及 ssleay32.dll 複製到 底下的 bin 或 modules 資料夾。
- 接著用文書編輯器開啟 Apache HTTP Server 的 httpd.conf(在 /conf/ 目錄下),尋找一堆 LoadModule 指令,先找到以下兩行:
#LoadModule dav_module modules/mod_dav.so
#LoadModule dav_fs_module modules/mod_dav_fs.so
把前面的 '#' 字元?jiǎng)h除,然後把下面幾行文字加到這群 LoadModule 指令的後面:
LoadModule dav_svn_module modules/mod_dav_svn.so
LoadModule authz_svn_module modules/mod_authz_svn.so
- 重新啟動(dòng) Apache HTTP Server。
問題排除
如果 Apache HTTP Server 無法啟動(dòng),請(qǐng)依下列步驟檢查:
- 檢查 Subversion 的路徑是否有在系統(tǒng)的 %PATH% 環(huán)境變數(shù)裡面。
- 檢查你加入 httpd.conf 裡的項(xiàng)目是否正確,記住 mod_dav_svn.so 和 mod_authz_svn.so 必須在其他 mod_dav*.so 模組之後載入。
|
2.3 設(shè)定 Subversion 檔案庫的路徑
現(xiàn)在要設(shè)定 URL 路徑與檔案庫實(shí)體路徑的對(duì)應(yīng)關(guān)係。對(duì)應(yīng)的方式有兩種,分別是 SVNPath 與 SVNParentPath。
2.3.1 SVNPath
SVNPath 適合用來個(gè)別指定檔案庫的路徑,語法是:
/svn/repos_name>
DAV svn
SVNPath /absolute/path/to/repository
其中 "/svn/repos_name" 就是用戶端存取特定檔案庫的 URI(Uniform Resource Indentifier),SVNPath 後面指定的路徑則是檔案庫的絕對(duì)路徑,假設(shè)我們的檔案庫實(shí)際存放的路徑是 d:/svn/MyProject,並且希望用戶端使用 "http://myserver/svn/myprj" 的 URL 來存取檔案庫,那麼要加入 httpd.conf 的內(nèi)容就是:
/svn/myprj>
DAV svn
SVNPath d:/svn/MyProject
注意 Location 標(biāo)籤後面的 /svn/myprj 的第一個(gè)斜線不可少!
2.3.2 SVNParentPath
如果你的檔案庫都集中放在某個(gè)目錄之下,例如:d:/svn,那你就可以使用 SVNParentPath 的方式指定檔案庫的根路徑,例如:
/svn>
DAV svn
SVNParentPath d:/svn
這表示可以讓任何人都可以透過 http://myserver/svn/<檔案庫名稱> 的方式,存取位於 d:/svn 這個(gè)目錄以下的所有檔案庫。也就是說,這個(gè)設(shè)定動(dòng)作只需要一次,如果使用 SVNPath,你必須為各個(gè)檔案庫分別指定對(duì)應(yīng)的路徑。
以上兩種設(shè)定方式都可以,方便起見,這裡我用 SVNParentPath 來統(tǒng)一指定所有檔案庫的父層 URL 路徑。
將 的設(shè)定加到 Apache HTTP Server 的 httpd.conf 檔尾就行了。
接著便可以開始建立檔案庫。
2.4 建立檔案庫
假設(shè)我們要把所有的檔案庫都放在 d:/svn 目錄下,現(xiàn)在要建立一個(gè)測(cè)試用的檔案庫,名稱叫做 在 repository,指令為:
md d:/svn
svnadmin create d:/svn/repository
命令執(zhí)行完後,檢查看看 d:/svn/repository 目錄底下產(chǎn)生了哪些目錄和檔案。
警告
檔案庫絕對(duì)不可以在建立在任何遠(yuǎn)端的儲(chǔ)存媒體上,例如:網(wǎng)路磁碟機(jī)。
|
這時(shí)候你已經(jīng)建立了一個(gè)檔案庫,你可以先在本機(jī)用瀏覽器測(cè)試一下,網(wǎng)址輸入 http://svn/repository,看看能不能看到檔案庫的內(nèi)容,正常的話應(yīng)該像下圖一樣。

如果以上的測(cè)試可以通過,應(yīng)該就行了。如果你還想要測(cè)試一下能不能從檔案庫取出整個(gè)工作複本,可以執(zhí)行下列指令(非必要):
c:
cdtemp
svn co http://localhost/svn/repository WholeRepos
上述指令會(huì)切換到一個(gè)暫時(shí)的目錄 c:temp,然後從檔案庫取出整個(gè)工作複本。最後一行指令是要 svn.exe 執(zhí)行 check out 動(dòng)作(縮寫 co),如果正確的話,應(yīng)該會(huì)顯示 "Checked out revision 0." 的訊息,此時(shí) /svn/repository 這個(gè)檔案庫底下的所有檔案目錄都已經(jīng)取出,並且複製一份到 c:/temp/WholeRepos 目錄下了。
問題排除
如果顯示的錯(cuò)誤訊息是:
svn: PROPFIND request failed on '/svn/repository'
svn: PROPFIND of '/svn/repository': 405 Method Not Allowed (http://localhost)
請(qǐng)檢查 Apache HTTP Server 的 httpd.conf 檔案裡面的 標(biāo)籤所定義的位置是否跟你指定的 URL 樣式相同,注意一定要完全相同,以上面的例子而言,你的 httpd.conf 的最後面應(yīng)該會(huì)有以下文字:
/svn>
DAV svn
SVNPath 指向檔案庫的絕對(duì)路徑
如果顯示的錯(cuò)誤訊息是:
svn: PROPFIND request failed on '/svn/repository'
svn:
Could not open the requested SVN filesystem
那表示在 /svn 對(duì)應(yīng)的實(shí)體目錄(即 d:/svn)下找不到 reposiroty 這個(gè)目錄。
註:PROPFIND 是給 WebDAV 用的 HTTP method,用來從資源中取得屬性。
|
測(cè)試完畢就可以把 WholeRepos 這個(gè)目錄整個(gè)刪掉了。
到目前為止,可以確定檔案庫已經(jīng)建立完成,接下來就可以匯入專案了。
2.5 匯入專案
不用急著把你現(xiàn)有的正式專案匯入檔案庫,先建立一個(gè)用來測(cè)試的專案目錄就好了。我們先在 c:/temp 底下建一個(gè) ProjectA 的專案目錄結(jié)構(gòu),參考下面的指令:
c:
cd temp
md ProjectA
md ProjectA/trunk
md ProjectA/branches
md ProjectA/tags
svn import . http://localhost/svn/repository -m "Initial repository layout"
提示
本文在執(zhí)行 svn 命令時(shí),都是使用 http 協(xié)定的方式,這樣我們可以確知 Subversion 與 Apache HTTP Server 的設(shè)定無誤,其他人就可以透過 Internet 存取檔案庫。當(dāng)然你也可以用其他的協(xié)定,例如:file:///,如果使用 file 協(xié)定,最後一行指令就變成:
svn import . file:///d:/svn/repository -m "Initial repository layout"
|
命令執(zhí)行無誤的話,應(yīng)會(huì)看到如下的畫面:

這時(shí)候 ProjectA 這個(gè)專案已經(jīng)匯入檔案庫了,也就是說,其他使用者可以開始存取這個(gè)檔案庫的專案取出文件和程式碼了。你可以參考 Subversion 的官方手冊(cè)中關(guān)於 svn.exe 這個(gè)用戶端命令列工具的使用方法,多練習(xí)一下取出檔案、加入檔案、以及存入檔案等指令。萬一練習(xí)的過程中發(fā)生錯(cuò)誤,或者檔案庫弄亂了,你可以把整個(gè)檔案庫的目錄砍掉,回到 2.4 節(jié)重新做一遍。
以下會(huì)進(jìn)一步討論檔案庫和專案目錄結(jié)構(gòu)的安排方式,如果你急著想試試看用戶端如何存取 Subversion 檔案庫,可以先跳到2.6 節(jié)或第 3 節(jié)。
2.5.1 檔案庫與專案的配置方式
延續(xù)前面的範(fàn)例,如果你再匯入其他專案,例如 ProjectB,那麼整個(gè)檔案庫的結(jié)構(gòu)會(huì)變成這樣:
/svn/repository/
+-- ProjectA/
+-- ProjectB/
也就是說 repository 這個(gè)檔案庫裡面包含了兩個(gè)專案。
如果你希望為每個(gè)專案建立一個(gè)檔案庫,那麼在 2.4 節(jié)中建立檔案庫的指令就變成:
md d:/svn
svnadmin create d:/svn/ProjectA
svnadmin create d:/svn/ProjectB
這樣就變成有兩個(gè)檔案庫了,檔案庫名稱分別是 ProjectA 與 ProjectB。
提示
如果專案之間有共享的檔案,建議把這些相關(guān)的專案放進(jìn)同一個(gè)檔案庫;如果專案之間彼此毫無關(guān)係,那就採用一個(gè)檔案庫放一個(gè)專案的方式,這種方式等於專案就是檔案庫。
第一種方式有個(gè)比較奇怪的「功能」你應(yīng)該要知道,就是一個(gè)專案的 check in 動(dòng)作,也會(huì)令其他專案的檔案的修訂版次遞增 ,如果這不是你想要的,請(qǐng)選擇第二種方式,即一個(gè)檔案庫只存放一個(gè)專案。
|
2.5.2 專案的目錄結(jié)構(gòu)
這裡補(bǔ)充說明一下 ProjectA 的目錄結(jié)構(gòu)。在 ProjectA 專案的根目錄下建立的 trunk、branches、和 tags 這三個(gè)目錄是有特別意義的,它們的作用分別是:
- trunk 目錄用來存份目前專案正在進(jìn)行開發(fā)的程式檔案和文件(又稱為主線,即 mainline);
- branches 用來存放主線的各個(gè)仍在發(fā)展中的分支;
- tags 則用來存放已經(jīng)不再變動(dòng)的分支,也就是其中的檔案不會(huì)再修改了。
這是 Subverion 官方手冊(cè)建議的目錄結(jié)構(gòu)安排方式,你可以自己決定要不要用這種配置方式,詳細(xì)說明請(qǐng)參考官方手冊(cè)的第五章,子標(biāo)題為 "Choosing a Repository Layout"。
提示
目錄名稱建議盡量不要用中文名稱,這樣在使用命令列時(shí)比較方便,也比較不會(huì)有問題。
|
2.6 使用 Windows 網(wǎng)域帳戶驗(yàn)證
照著前面的步驟做,你會(huì)發(fā)現(xiàn)存取檔案庫時(shí)都不用輸入帳號(hào)密碼,這是因?yàn)槲覀冎暗脑O(shè)定沒有啟用身分驗(yàn)證的功能。但是我們通常不希望所有人都能任意存取你的檔案庫,免得重要資產(chǎn)外洩,或者資料被破壞,因此了解如何加入身分驗(yàn)證也是必要的。
Serversion 提供了多種驗(yàn)證使用者身份的方式,這裡只介紹 Windows 身分驗(yàn)證的方式,這種方式很適合用在開發(fā)團(tuán)隊(duì)成員都在區(qū)域網(wǎng)路內(nèi)的情況。請(qǐng)依下列步驟進(jìn)行:
- 取得 SSPI 模組,下載網(wǎng)址為 http://tortoisesvn.tigris.org/mod_auth_sspi.zip。
- 把 zip 裡面的 mod_auth_sspi.so 解壓縮到 modules 目錄下。
- 把下面這行加入到 Apache 的 httpd.conf 裡面:
LoadModule sspi_auth_module modules/mod_auth_sspi.so
注意上面加入的這行一定要放在下面這行的前面:
LoadModule auth_module modules/mod_auth.so
- 修改 httpd.conf 的 設(shè)定如下:
DAV svn
SVNParentPath d:/svn
AuthType SSPI
AuthName "Subversion 檔案庫"
Require valid-user
SSPIAuth On
SSPIAuthoritative On
SSPIDomain
SSPIOfferBasic On
其中 就是你的 Windows 網(wǎng)域控制器的電腦名稱(例如:WIN2KDC),注意兩邊的括號(hào) <> 不用保留。如果你的環(huán)境沒有網(wǎng)域控制器,就維持原來的 就行了。在我的環(huán)境下,我發(fā)現(xiàn)即使有網(wǎng)域控制器,但是這裡不去設(shè)定它,還是能夠正常的驗(yàn)證使用者身分。
- 重新啟動(dòng) Apache。
好了,現(xiàn)在開啟瀏覽器,輸入網(wǎng)址 http://127.0.0.1/svn/repository 看看,你預(yù)期應(yīng)該會(huì)看到如下的驗(yàn)證畫面:

但是卻沒有出現(xiàn)這個(gè)畫面,而是直接顯示檔案庫內(nèi)容,怎麼回事?
因?yàn)槲覀儸F(xiàn)在是使用 Windows 帳戶驗(yàn)證,你目前已經(jīng)登入這臺(tái)機(jī)器了,而你要存取的也是本機(jī)的資源,換句話說,你的身分已經(jīng)被驗(yàn)證過了,所以就不會(huì)再要求你輸入帳號(hào)跟密碼,這是採用 SSPI 網(wǎng)域驗(yàn)證的好處。
那麼,如果你的同事 John 的電腦有加入網(wǎng)域,但是他平時(shí)都是登入本機(jī),而非登入網(wǎng)域,在存取檔案庫時(shí)會(huì)不會(huì)要求輸入帳號(hào)密碼?答案是如果 John 登入他本機(jī)的帳號(hào)和密碼跟他在網(wǎng)域使用者的帳號(hào)密碼完全一樣的話,就無需再輸入密碼;相反的,如果登入本機(jī)的使用者帳號(hào)和密碼與網(wǎng)域使用者帳號(hào)密碼不同,第一次存取時(shí)就必須輸入密碼。
你可以在別臺(tái)機(jī)器上,用一個(gè)網(wǎng)域裡沒有的使用者帳號(hào)去存取 Subverion 檔案庫,如果正確的話,應(yīng)該就會(huì)出現(xiàn)要求輸入帳號(hào)密碼的視窗。
以上還只是最基本的設(shè)定,如果你希望做些進(jìn)階的設(shè)定,例如允許所有人都可以檢視檔案庫的內(nèi)容,但是不能修改;或者要加入 SSL 加密機(jī)制,建議您參考 [2] 的第三章。
提示
啟用身分驗(yàn)證之後,你會(huì)發(fā)現(xiàn)用命令列工具 svn.exe 存取檔案庫時(shí),如果是用 http:// 協(xié)定,有些子命令(subcommand)執(zhí)行時(shí)會(huì)出現(xiàn) "authorization failed" 的錯(cuò)誤,這時(shí)候你可以在 svn 命令中加入 --username 和 --password 來提供使用者名稱和密碼,例如:
svn co http://myserver/svn/ --username michael --password guesswhat
或者你也可以改用 file:/// 協(xié)定。
|
3 安裝用戶端:TortoiseSVN
現(xiàn)在你已經(jīng)有一個(gè)可以咦韉?Subversion 伺服器,可以試著在其他電腦上存取檔案庫了。如果你習(xí)慣使用命令列工具,那就只要在用戶端電腦上安裝 Subversion 就行了,存取檔案庫都是透過命令列工具(主要是 svn.exe)。這裡要介紹的是一個(gè)專門為 Windows 作業(yè)系統(tǒng)設(shè)計(jì)的 Subversion 用戶端:TortoiseSVN(以下簡稱 TSVN)。
3.1 安裝 TortoiseSVN
- 到 http://tortoisesvn.tigris.org 下載最新的安裝程式,下載後直接安裝。安裝過程大都是按下一步,只有在問你

安裝完成後會(huì)要求你重新開機(jī)。
- 到 http://tortoisesvn.tigris.org 下載繁體中文的語言包(language pack),請(qǐng)注意語言包的版本應(yīng)該要跟你安裝的 TSVN 版本相同,否則最好不要安裝。語言包裝完之後,用檔案總管在 Windows 桌面上或任何一個(gè)資料夾上點(diǎn)一下滑鼠右鍵,選擇 TortoiseSVN -> Settings 以開啟設(shè)定視窗,在 "Main" 頁夾中更改 Language 設(shè)定為「中文(繁體)」,再按「確定」鈕即可。
- 如果你是透過 proxy server 存取 Internet,請(qǐng)?jiān)?TSVN 的設(shè)定視窗中,切到「網(wǎng)路」頁夾,然後輸入你的 proxy server 相關(guān)資訊,否則你將無法存取位於 Internet 上的檔案庫。
安裝完成之後,在任何目錄名稱上點(diǎn)一下滑鼠右鍵都可以看到 TSVN 的功能選項(xiàng),這也是 TSVN 方便的地方,它不用跟開發(fā)工具整合,而是跟作業(yè)系統(tǒng)整合在一起,這樣不管你用什麼開發(fā)工具,都可以輕鬆的使用 TSVN 來存取檔案庫。
接下來你可以用 TSVN 練習(xí)一下存取之前建立好的檔案庫,試著把你現(xiàn)有的專案匯入檔案庫中,並且在用戶端使用 TSVN 執(zhí)行取出、存入、更新等動(dòng)作。
TSVN 雖然是用戶端工具,不過它也提供了建立檔案庫、以及匯入、匯出等功能,因此安裝在伺服器端也挺方便的。
4 結(jié)語
按照本文說明的安裝步驟,希望能讓你順利在 Windows 環(huán)境下把 Subversion 安裝起來。但是安裝成功以後,真正的工作要才開始,如果你沒有花點(diǎn)時(shí)間閱讀 Subversion 的相關(guān)文件,在使用版本控制系統(tǒng)的過程中,一定會(huì)碰到許多問題。
在正式將你的專案加入 Subversion 檔案庫之前,建議您多考慮一下:
- 檔案庫的配置方式。究竟要為每一個(gè)專案建立一個(gè)檔案庫,還是把多個(gè)專案放進(jìn)同一個(gè)檔案庫裡?
- 專案目錄的結(jié)構(gòu)。你要依照官方手冊(cè)的方式,在專案的根目錄下建立 trunk、branches、和 tags 嗎?
- 哪些東西要放進(jìn)檔案庫裡?
前兩個(gè)問題你可以參考 [1] 的建議(第五章),再衡量自己的需求來決定。你不見得要依照官方的建議,第一次也許採用最單純的配置方式會(huì)比較好,例如:一個(gè)檔案庫就只放一個(gè)專案,而且只把程式的原始碼 放進(jìn)檔案庫,也不去分主線支線了,因此專案的目錄結(jié)構(gòu)可以很單純,程式原始碼的根目錄就是專案的根目錄。自己動(dòng)手做過幾次以後, 再去觀察檔案庫的內(nèi)容,就會(huì)比較有感覺了,然後再來考慮自己團(tuán)隊(duì)的需求,自然就能找到最適合自己團(tuán)隊(duì)的配置方式了。
後記
這份文件快要寫完時(shí),才發(fā)現(xiàn) [2] 已經(jīng)提供一份類似的文件了,不過既然寫了,還是公佈出來吧,中文資源多一些總是好的。
轉(zhuǎn)載自:蔡煥麟的文章
補(bǔ)充:
<Location /svn>
意味著可以通過像這樣的URL(
http://MyServer/svn)來訪問Subversion版本庫
DAV svn
告訴Apache哪個(gè)模塊負(fù)責(zé)服務(wù)像那樣的URL--在這里就是Subversion模塊
SVNListParentPath on
在Subversion 1.3及更高版本中,這個(gè)指示器使得Subversion列出由SVNParentPath指定的目錄下所有的版本庫
SVNParentPath D:\SVN
告訴Subversion在目錄D:\SVN下尋找版本庫 #(修改成你自己的目錄)
AuthType Basic
啟用基本的驗(yàn)證,比如用戶名/密碼
AuthName "Subversion repositories"
當(dāng)一個(gè)驗(yàn)證對(duì)話框彈出時(shí),告訴用戶這個(gè)驗(yàn)證是用來做什么的
AuthUserFile D:\passwd #(密碼文件,不是文件夾哦)
指定D:\passwd用為密碼文件用來驗(yàn)證用戶的用戶名及密碼
AuthzSVNAccessFile D:\svnaccessfile
指定D:\svnaccessfile來限定各個(gè)用戶或組在版本庫中目錄的訪問權(quán)限
Require valid-user
限定用戶只有輸入正確的用戶名及密碼后才能訪問這個(gè)路徑