2007年8月21日 星期二

[程式設計] 為你的程式加上版本控制 -- SVN

Subversion 是一套用來進行版本控制的軟體, 簡稱為 SVN, 常被用來管理軟體專案開發. 也有人用 SVN 來管理文章.

利用這套軟體強大的版本控制功能, 我們也可以像 Wiki 一樣, 進行多人共筆的文章, 不過大多數的人都把它用來管理自己的軟體專案.

比較常見的版本控制軟體有 Concurrent Versions System (CVS), 微軟的 Visual Source Safe (VSS). 而 SVN 的設計目標就是用來取代 CVS.

剛開始接觸 SVN的人, 會以為 SVN 又是一個安裝複雜的大怪獸. 其實

SVN 安裝非常簡單, 只要下載 Zip 檔, 解開, 完成.

我們先來看看怎麼用 svn 管理自己的程式專案吧.

如果改程式, 沒有先備份, 你會發現隨著時間的累積, 你會越來越不敢改程式.
因為有可能一不小心, 就有可能把程式邏輯弄亂了. 等到發生問題了, 卻找不到當初改的什麼地方. --- 這可真的傷腦筋了.

如何讓軟體開發持續進行, 又避免因為亂搞導致整個專案程式亂掉,
是我們要思考的事情.

版本控制就是我們的救星.
以前, 我都是直接複製整個專案, 自己建立專案歷史版本目錄, 現在我把它交給 SVN.

對我來說, 版本控制的好處是:
對個人來說

可以幫你追蹤每個專案的更改過程, 備份所有專案的開發歷史紀錄.
如果有 svn 幫你維護 source code 每個開發時期的版本, 那麼我們就可以大膽的把試驗的結果寫到真正專案中, 而不必擔心因此造成混亂. -- 因為當整個程式邏輯混亂時, 大不了把之前的版本的專案吐出來就好了.

對團隊開發來說

可以讓多人同時進行開發同一個專案, 而且保持專案主線的一致性. 當然也可以讓每個人得到一個個人專案的副本, 進行測試開發. 最後再合併到主線.


為何要用 SVN 管理我的 Source Code ?

  1. SVN 安裝下載非常簡單, 只要下載 Zip 檔, 解開, 完成.
  2. SVN 比 CVS 好的地方 (view)
  3. 世界兩大 Open Source 社群 SourceForge.netTigris.org 提供 SVN 服務, 讓你可以把專案, 放到他們的網站上, 讓全世界的人一起透過 SVN 持續地開發你的程式.
  4. 所有專案內的檔案與目錄變化, 全部版本化進行管理
    • 不必手動輸入指令: 透過 TortoiseSVN, 可以直接在檔案總管上進行操作 .
    • 你可以直接在檔案的 icon 就知道這個檔案是否已經修改過.
  5. 免費且opensource
  6. 可搭配強大的整合版本控制系統: Trac
    • 提供 Wiki, Timeline, Roadmap, Browse Source 等整合功能

下載 SVN Server (非常簡單)

Step 1:

到 Tigris.org 這個網站

Step 2:

選擇 svn-win32-1.4.4.zip 下載,

(注意: 解開放到你想要的目錄中, 並設定系統環境變數 Path 到 bin 目錄)

Step 3:
完成 SVN 安裝


下載 SVN Client (與檔案總管完全整合)

網站, 下載 TortoiseSVN

通用的檔案結構

一般來說, 我們的專案主目錄下, 通常不成文規定會建立三個目錄. 分別為

trunk: 放一直持續發展的 source code, 即工作主線

branches: 放一些正在修改的分支, 稍後會合併的工作副本
tags: 當發展到一個固定的階段, 可以放 Release 版本的東西

操作方式 (命令列的方式, 如果你用 TortoiseSVN 則不需要打命令)
如何建立一個版本資料庫 ?
<sol> 最簡單的方法是使用命令列

set LANG=en_US

svnadmin create c:\svntest

如果不設定 LANG 變數, 則會產生下面的亂碼訊息.

svn01

如果設定正確與延後, 則會顯示英文訊息,

svn02

上面的命令列方式預設使用 native file system (fsfs) 的方式建立資料庫.

*如果你使用 TortoiseSVN 建立資料庫, 則會遇到 file system 選項問題,

Berkeley DB or Native filesystem ?

建立 Respository 時, 如果你選擇的 Berkeley DB (BDB), 那麼這個 Respository 將不能用在網路上進行分享, 如果硬作分享, 可能會在程式開發幾個月後才發現 庫存毀損的情況
如果你想要在網路上分享 Respository, 請選擇 Native filesystem (FSFS)

如何執行 SVN server ?

<sol>

svnserve -d -r c:\svntest

如何將目前的專案, 放到 SVN 進行管理?
<sol>
svn import 我的專案目錄 svn://localhost/svntest

如何用 TortoiseSVN 把整個專案 checkout 到指定目錄?
<sol>

點選一個目錄, 滑鼠右鍵: SVN Checkout

如何用 TortoiseSVN 把修改後的內容, 進行更新呢?
<sol>
點選你的修改目錄: 滑鼠右鍵:

1. SVN Update

2. SVN Commit


其他常用的指令

如何合併副本到主線
Step 1. 先查出分支是哪一個修訂版序號
svn log svn://localhost/svn1/branches/a/我的分支
Step 2. 合併由該序號開始
svn merge -r 開始的序號 :HEAD svn://localhost/svn1/branches/a/我的分支

如何建立 Release 版
從一直修正的版本中, 取出一個版本當作 release 版, 主線還是繼續接受修改

下面的例子: 把 trunk/a 下的專案內容, 另外分支成一個 release 版本
svn copy svn://localhost/svn1/trunk/a \
svn://localhost/svn1/trunk/a/release-1.0 \
-m "標記這是 release 1.0 版."

如何刪除某個分支
svn delete svn://localhost/svn1/branches/a/我的分支

如果 repository 的分支改名稱了, 我該怎麼 commit 呢?

直接使用 switch 就可以了.

延伸閱讀

[1] 翻閱維基百科, 則可以看到不同的版本管理軟體優缺點比較 (view).

[2] Wiki 的中文介紹 (view)

[3] SubVersion 主站 (view)

[4] Version Control with Subversion (電子書, 中文版) (view)

[5] SubVersion 中文站 (view)

沒有留言:

張貼留言