版本控制入門SubVersion+toitoiseCVS

"即使你的團隊只有你一個人,你的項目只需一週的時間;即使那是'用過就扔'的原型;即使你的工作並非源碼;確保每樣東西都處在源碼控制之下--文檔、電話號碼錶、給供應商的備忘錄、makefile、構建與發佈流程、燒製CD 的shell 腳本--每樣東西。"
(《程序員修練之道》)。

對於每一個程序員來講,怎樣能夠最好的保護你的源代碼都是最重要的一件事。一個源碼控制軟件就相當於一個系統級的Undo 鍵,當你的程序可用時,作一個標記,當程序被改的體無完膚不能運行了,你可以方便的回到上一個可用的版本,或者當你發現自己想找回上週被你刪除的一個函數的時候,你可以很容易的做到這一點。

當然,好的版本控制並不止於此。對於團隊開發來講,你可以控制每個人的分工和權限。兩個人可以同時編輯同一份源代碼,由程序來提醒兩次修改中存在的衝突。你可以查看某一處改動是誰做的。當你發佈了一個正式版,可以建立一個分支,在分支上繼續開發下一個版本,而對於後來發現的Bug,可以在主分支上繼續改進,如果分支上同樣存在這個Bug,可以將兩者合併。只要修復一次就可以,這不是很誘人嗎?

目前業界流行的版本控制系統有很多,商業軟件比如ClearCase,配置複雜,功能強大,價格也同樣對得起它的功能。而Visual Studio 自帶的SourceSafe 與它的開發工具完美整合,使用方便,但是對於其它語言和工具的支持就差一些了。開源世界最著名的版本控制軟件是CVS,相當一部分的開源軟件都在使用這個軟件,以供全球的程序員協作開發。然而,CVS 有一些與生俱來的缺點,在設計之初沒有考慮到,而隨着使用量和使用狀況的大增,慢慢顯露了出來,比如,最重要的一點,它不支持文件改名,還有,只對文件控制版本,沒有目錄的管理,等等。

後來,CVS 的主要作者(Fogel 等等)在他們現任公司的資助下開發了SubVersion,用以替代CVS。SubVersion 的設計目的就是針對CVS 的一些弱點進行改進。目前已經有幾個知名的開源項目從CVS 轉向了SubVersion 來保存源代碼。SubVersion 目前發佈了1.1 正式版,已經相當穩定可靠了。本文只是對SubVersion 安裝和使用入門的一點引導,以便從未用過版本控制的程序員可以快速上手,先從保護你的個人代碼開始。

安裝:
SubVersion 對於目前流行的大部分平臺都有支持,可以到subversion.tigris.org 下載各個平臺的安裝包,或者下載源代碼在linux 等平臺上自己編譯。對於windows 平臺,它也提供了安裝程序。

一點說明:SubVersion 的運行分爲兩種情況,一種是作爲獨立的服務器,默認使用3690 端口,像CVS 那樣來運行,支持直接連接或者SSL 連接。另一種是藉助Apache2 的webdav 功能,直接掛接在apache 上,作爲它的一個模塊來運行。

這兩種配置方式是各有優缺點的。首先,當svn 獨立運行的時候,作爲一個輕型的服務器,反應速度和連接速度都要比apache 要快一些。它有自己的用戶認證方式,(使用系統中現有的帳號),它比apache 更容易配置和使用。當用戶以自己的身份登錄以後所做的任何操作將被記錄下用戶名。以apache 的模塊來運行的時候,整個系統是以apache 所在的身份來運行的,所有的用戶(包括任何驗證過的用戶)都是使用這個身份的,那麼你就沒有辦法區別不同用戶的操作了。(有一個辦法,就是讓用戶自己把名字寫到每次checkin 的message 裏面)。它的優點是可以使用apache 現有的架構,不需要去改動你的防火牆,而且,可以使用IE 提供最簡單的查看最新版本的功能。Apache 有很多的認證方式,還有非常細緻的對目錄的權限管理,而且apache 是一個安全、穩定的服務器。

具體使用哪一種服務器取決於你的需求,也可以幾種方式一起用,svn 並不在乎這個。但是,爲了容易管理和配置,建議你還是選擇其中一種。(大部分人會選擇apache 的方式,因此本文只詳細說明這種方式的安裝和使用,對於svn 獨立運行的情況作爲附屬的章節供大家參考。)

Windows 上的安裝:安裝過程很簡單,雙擊下載回來的svn-1.1.0-setup.exe,一路回車就可以安裝好了,連必須的兩個環境變量都幫你配置好了。在安裝目錄的httpd 目錄下有兩個so 文件,複製到apache 的modules 目錄中,bin 目錄的dll 文件複製到apache 的bin 目錄下或者系統的system32 目錄下,(取決於你的apache 的運行狀況),在apache 的httpd.conf 裏面找到兩行:

LoadModule dav_module modules/mod_dav.so
LoadModule dav_fs_module modules/mod_dav_fs.so

確保它們沒有被註釋掉。然後在這兩行的下面添加兩行:

LoadModule dav_svn_module modules/mod_dav_svn.so
LoadModule authz_svn_module modules/mod_authz_svn.so

重啓以後svn 就以apache 模塊的方式來運行了。如果出現apache 啓動不起來的問題,看看svn 命令是否在你的環境變量PATH 裏。Linux 上的編譯安裝:對於下載回來的.tar.gz 文件,用tar zxvf 命令解壓,進入解壓出來的目錄,./configure-with-apxs=/path/to/apache/bin/apxs,然後make && make install,安裝完成時會自動修改你的httpd.conf 文件,添加前面那兩行,不需要你再做任何操作。

配置:
安裝已經完成了,接下來要讓它可用還需要兩步操作。

首先要確定你保存某個工程的位置。比如你要把所有的工程放在D:/repos 目錄下,現在要建立一個工程project1,在命令行輸入:Svnadmin create d:/repos/project1

該命令會創建這個目錄,並建立所必須的一些數據庫和配置文件。然後到httpd.conf 文件裏添加對該目錄的映射。Svn 有兩種映射方式,一種是針對每個項目,確定一個虛擬目錄(Location),另一種可以對一個總目錄確定一個虛擬目錄,其下的所有工程只要在該目錄下直接輸入工程名即可。第二種當然是要方便的多了。不過我們還是介紹一下第一種吧。在httpd.conf 的任意位置(如果你需要在某個虛擬主機裏面實現,就添加到那個虛擬主機的配置段)添加以下內容:(注意apache 的配置文件裏不能使用/,要用/來代替)

<Location /svn/project1>
DAV svn
SVNPath D:/repos/project1
</Location>

重啓apache 以後,在瀏覽器裏輸入Http://localhost/svn/project1,應該就可以看到該工程的內容了,新建的工程會顯示Revision 0:/。使用這種方式,必須對你的每個工程都添加這樣一段配置,而svn 提供了另一個選項。

<Location /svn>
DAV svn
SVNParentPath D:/repos
</Location>

這樣,該目錄下所有的工程文件就都可以訪問了。你同樣可以輸入上面的地址來驗證一下。

如果要限制別人對倉庫的訪問,直接在該Location 段加入任何合法的apache 的權限控制命令就可以,比如:

AuthType Basic
AuthName "Subversion repository"
AuthUserFile /path/to/users/file

如果想讓驗證通過的用戶有寫權限,匿名用戶有隻讀權限,可以在下面再加兩行:

<LimitExcept GET PROPFIND OPTIONS REPORT>
Require valid-user
</LimitExcept>

具體的配置方式有很多,請參考apache 的說明文檔。

OK,安裝配置已經完成,下面可以開始使用了。

使用:
比如你現在要把一個現有的工程Project1 要放入svn 的控制之中,並且使用前面建立的那個數據倉庫。打開命令行,進入你的這個工程目錄,執行:Svn import . http://localhost/svn/Project1 -m "This is my project"

注意import 後面是個點表示當前目錄。如果不用點也可以,默認就是使用當前目錄。

然後你會看到該目錄下所有的目錄和文件都被添加了。用瀏覽器打開上面這個地址,應該可以看到該目錄下所有的文件和目錄了。(切記,svn 以apache 的身份來運行,這個用戶名需要有對該目錄寫入的權限。在windows 上這通常不是問題,但是在linux 上,你最好能夠考慮清楚一些)。

這個文件列表是由svn 模塊生成的,如果你覺得太簡陋,可以寫一個自己的xslt 轉換文件,添加到配置段。具體信息參照svn 的幫助文檔吧。

現在只是你的工程文件被導入了,你的現有文件並沒有在svn 控制之下。你可以刪除你原來的工程目錄了,(安全起見,還是給它改個名字比較好)。到上層目錄下執行:Svn checkout http://localhost/svn/Project1

該命令會自動在當前目錄下建立Project1 目錄,並下載回倉庫中所有的文件。該命令還有很多參數,比如指定要建立的目錄的名字,或者指定要導出的版本號等等。

現在該工程中每個目錄下都有了一個.svn 的隱藏目錄,以後某個文件被改動了以後,用svn status 可以查看,svn checkin 可以將所做的更改放入倉庫中。具體可用的命令還是去看subversion 的使用手冊吧,(安裝以後的那個幫助文件),這份文檔還是詳細讀一下比較好。還好,有中文版,只不過是繁體的:http://svn.ntcu.net/svnbook/book.html

如果所有的命令都要這樣輸入, 是不是太慢了? 可以使用可視化的管理工具TortoiseSVN , 在這裏下載:http://tortoisesvn.tigris.org/。該工具與操作系統整合,給各種類型的文件標上不同的圖標,並且可以以可視化的方式顯示所有的變更記錄,使用起來非常直觀,也非常方便,而且提供了多國語言包,包括簡體中文,我們就不多說了,一看就明白。另外,對於使用eclipse 的用戶,還有一個插件可用,http://subclipse.tigris.org,這兩者結合使用,功能相當強大。

以獨立服務器的方式安裝:
如果你只是在自己的機器上裝上一份來對自己的日常工作提供版本控制功能,或者你沒有apache2,也不想安裝這個東西,那麼,把svn 安裝獨立的server 也是一個不錯的選擇。

實際上,在windows 上安裝完成以後不需要做任何操作你就可以開始使用了。按照前面說的方法新建一個測試用的庫:Svnadmin create d:/repos/test1

然後隨便找個目錄導入一下試試看:
Svn -import . file:///d:/repos/test1 -m "just a test"

是不是成功了?這樣的命令方式只能在本機上使用。要啓用svn 伺服器,只要在命令行上運行svnserve -d 就可以了。很簡單,不是嗎?再試一下(打開另一個命令行窗口,這個一定不能關閉啊):

Svn -import . svn://localhost/d:/repos/test1 -m "just a test"

這個網址看上去有些奇怪,到你的運行server 的命令行窗口中,用ctrl+C 終止它的運行,再使用svnserve -d -r d:/repos來運行它,這樣server 就知道你的版本庫的默認目錄是什麼了。然後再導入和使用的時候,地址只要寫svn://localhost/test1就可以了。

在linux 上也是一樣的,配置的時候可以不用-with-apxs 了,直接configure,然後make && make install 就可以了。運行server 的命令也是一樣的。

如果要把svn 作爲一個後臺服務來運行怎麼辦呢?總不至於一直讓它開着一個窗口吧?萬一不小心關了……在linux 下要把它作爲後臺服務很簡單,其實只要在命令的後面加上&就可以了,也就是通用的形式:svnserve -d &,這樣它就會在後臺一直運行下去。或者你也可以讓它使用xinetd 的方式來運行。但是在windows 上,就比較麻煩一些了,因爲作者沒有考慮到(或者說沒有考慮)使用者的這個要求,因此,它不能像apache 那樣容易的把自己安裝成服務,不過既然使用者都是程序員……到http://dark.clansoft.dk/~mbn/svnservice/下載一個專爲這個任務而寫的小程序就可以了,使用方法在這個網頁上有詳細的說明。

在這種方式下如果要進行用戶控制,可以使用ssl 協議的方法,那麼,地址就變成svn+ssl://localhost/test1 了,但是這種方式要求windows 上有可用的ssl 客戶端。也可以用密碼文件的方法,打開你的d:/repos/test1/conf 目錄下的svnserve.conf,將
anon-access = read
auth-access = write
password-db = passwd
註釋去掉,passwd 跟CVS 一樣是使用apache 的htpasswd 程序來生成,放在該conf 目錄下即可。另外提一句,apache 驗證如果使用basic 方式的話,你在瀏覽器端輸入的用戶名和密碼是以明文在網絡上傳輸的,這並不是很安全。而svn 的客戶端在使用這種密碼文件方式驗證的時候,在網絡上傳輸的只是md5 值,比apache 還要安全一些。

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