前幾天聽到一個同學在趕 project ,結果他 code 修得亂七八糟,然後改到後來發現想要把
code 恢復成曾經寫過的某個版本,但有的地方是忘記怎麼寫,有的地方則是改起來十分麻煩等等,我想如果他有做好版本控制的話,也許就不會這麼囧了…
有鑑於此,我教了幾個朋友簡單使用 subversion 來作版本控制,也許你會問我為什麼不教 CVS 或 Visual Source
Safe 等等,很簡單,「因為我只會 subversion !」當然我本身會的也沒有很多,所以只能稍微簡介一下而已 :p
簡單來說,一般版本控制軟體的架構大致是會有一個貯藏庫(Repository,而不是 database),它用來儲存你每次對整個
project 增加、修改及刪除等等動作,每當你將 project 修改至某一個程度(你可以說是某個版本),就可以利用版本控制軟體把你修改的動作送交(commit)到貯藏庫,把這次的修改定為一次修訂版(revision)。正因為這個貯藏庫記錄了每一次修訂版,所以當你想要從貯藏庫取回(checkout)project
時,可以指定任何一次修訂版本,版本控制軟體會幫你處理好從最初版開始的一切動作,當然,如果你本來就存有 project 的 code
,也可以用版本控制軟體作更新(update)的動作來將你所存的 project 更新到最新的修訂版本。
上述的簡介大致提到了在用版本控制軟體時的基本操作,而我這篇文章主要是要介紹 subversion 這個版本控制系統,關於這個系統我就不多作介紹了,我只會提及在各個平臺要怎麼把上面的動作作出來而已。既然作版本控制需要一個
repository ,這裡介紹兩個在網路上可以找到的 subversion 服務:OpenSVN 及 Google Code
上的 Project Hosting 。這兩個網站你都可以隨意(似乎是如此)建立新的 repository 放你的 project
(惟 Google Code 一個 project 的 repository 限制磁碟空間最多只能使用 100 MB),之後的例子會以
Google Code 的 Project Hosting 當作例子示範。
在 Google Code 的左側導覽列中點選 Project Hosting 便會來到上面的網頁,這時再點選 Create
a new project 就可以填入你 project 的相關資料,這樣 Google Code 就幫你產生了一個 repository
了。設定好之後你只要先知道你 repository 的位址(到你 Project 首頁的 Sources 裡去看,會是 https://<你project名稱>.googlecode.com/svn/)就可以了,同時你也要知道你在
Google Code 的密碼,到右上角的 My Profile -> Settings 裡就會有 Google Code
產生的密碼,這個也要記住,因為當你在 commit 的時候會需要用到。
版本控制總需要一個 client-side 的軟體,在 Unix 系的環境裡你安裝好 subversion 相關套件後,就可以在終端機下使用
svn 這個指令來作版本控制,而在 Windows 上,你可以使用一個有圖形化介面的 subversion 軟體:TortoiseSVN,安裝這個軟體後,它就會在你檔案總管的右鍵選單中加入
subversion 的相關指令,相當方便易用。
安裝好 TortoiseSVN 之後,你可以選擇你要存放 project 的位址,然後在該處按右鍵選 SVN Checkout…,再填入你
project repository 的網址及要儲存的資料夾,輸入完帳號及密碼後, repository 上的檔案就會下載下來了。注意你
repository 下會事先建立好三個目錄:branch、trunk及tags,如果你還不是很熟悉版本控制的話,就先把你的 code
放在 trunk 目錄下就好了,所以在 checkout 的時候網址應該輸入:https://<你project名稱>.googlecode.com/svn/trunk/,然後本地端再輸入你
project 的名稱就好,這樣一來你就有一份本地端的 repository 了。
接著,你就可以在這個目錄下放你 project 的資料了,當你決定要 commit 到伺服器上的 repository 時,只要在
project 的目前上按右鍵,選擇 SVN Commit...,這時就會跳出一個對話盒問你要加入或修改哪些檔案,然後也可以讓你填入
log 好記錄這次的修訂版本做了什麼修改,方便日後你要取出某個修定版本時作參考。
如果你在不同的地方都有放一份 repository ,那你每次要修改 project 內容時,都應該先利用 SVN Update
的功能,讓你把 repository 更新到最新的狀態(當然,你也可以選擇要更新到第幾次修訂版 TortoiseSVN ->
Update to revision...),這樣當你在作 commit 動作時,才不會出現有不同步的狀況,因而發生 conflict
,那就要再仔細檢查應該如何修改 code 消除 conflict 了。
如果 project 已經發展到某個成熟的版本,但想要開設一個 branch 來加入新功能的時候要怎麼做呢?或者是新的 branch
要與原先成熟的版本整合(merge)的時候又該如何?
假設我現在有一個 project 發展到 revision X ,我認為這個版本已經成熟到一定的程度,而暫時不加新的 features
時,也許我會想要複製一份這個 project 然後來加新功能,這樣的動作就是為你的 project 建立了一個 branch ,如此一來我一樣可以利用版本控制軟體來管理新的
branch ,也可以同樣管理原來的版本。
回想一下你在 Google Code Hosting 上的 repository ,它不是預先建立了三個目錄?其中一個就是 branches
,如果你要為你的 project 建立一個 branch ,就可以利用 TortoiseSVN -> Branch/Tag...來作,如果你沒有打算使用別的名稱,那在
To URL: 的欄位可以填入 https://<你project的名稱>.googlecode.com/svn/branches/branch-001
,然後再選擇你要從哪一份 code 來建立 branch 以及寫上 log。而別忘了,當你作好 branch 之後,別忘了在本地端用另一個目錄
checkout project 的 branch 回來,這樣在 commit 的時候才不會搞錯。
而當你的 branch 如果也發展到某一個成熟穩定的版本,想與先前的穩定版本(放在 trunk 裡的)作一個 merge 動作時,可以在
trunk 的 working copy 上使用 TortoiseSVN -> Merge... 來操作,它會問你要哪兩份
branch (或 trunk)要作 merge,當然也可以指定要跟第幾個 revision 來作 merge ,如果你害怕在作
merge 時會有無法預期的錯誤發生,那可以先利用 Diff 來看兩個版本的差別,或是試跑(Dry run)看看有沒有錯誤產生。一旦決定好了,按下
merge 就會把 From: merge 到 To: 了。
在預先建好的三個目錄裡,branches 和 trunk 都提過了,其實 tags 也算是一個 branch ,只是這個目錄主要是讓你放入「特殊的
branch」,比方說 release1.0 之類的名稱,如果有人想要 checkout 你的 project ,當然利用 tags
下就可以快速找到他想要的版本(因為別人不可能知道你 trunk 或 branches 的每個 revision 作了什麼事),所以
TortoiseSVN 才把 branch 跟 tag 的指令放在一起。
如果是在 Linux 或 Mac 下,在安裝該平臺上的 subversion 之後,就可以在終端機下使用 svn 指令來操作
subversion,像這樣:
svn checkout 或
svn commit
svn update 等等
其它的概念就跟在 Windows 上使用 TortoiseSVN 一樣囉。
一些用 subversion 的基本操作大致上就是這樣,希望這樣簡單的介紹可以讓大家熟悉如何用版本控制軟體管理自己 project
,以免悲劇再度發生 :p
參考書籍:Version Control with Subversion, O’Reilly
|