【第181期 November 5, 2012】
 

研發新視界

專案程式版本控管心得分享(上)

作者/陳冠寧

[發表日期:2012/10/5]


前言

為什麼需要版本管理?其實這問題相當的常見,只要你開始做版本管理,你可以自由簽入任一版本,心血不會因為人為疏失而付之一炬。

備份檔案是一件很重要的課題,種種資料消失的事件,不管是檔案誤刪、硬碟掛掉或是用舊檔覆蓋到新檔,這電腦用久了多多少少都會遇到,而且遇到的時候往往都已經無法挽回,如果是個人自行訂定目標,沒有時程壓力的事情才可以比較坦然,如果今天做的是公司的案子或是外面接來的案子結案前一天硬碟和你說再見,那真的是欲哭無淚,所以備份工作的重要性是不言而喻的。

專案開發過程中常遇到的情形有:

‧檔案互相覆蓋
‧檔案因系統當機遺失
‧比對版本間程式碼不同的地方
‧倒回至之前的版本
‧查詢有哪些人更改過程式碼
‧同時多人修改同一程式,需鎖定單一使用者於單一時段修改直到解除鎖定為止

為了因應以上種種情形,工程師需要對專案進行版本控制(version control)。版本控制也有人稱它為原始碼控制(source code control),版本控制系統則是提供上述功能的軟體系統,它提供了一個地方讓你集中存放開發過程中的所有程式檔案及文件,以便達到集中控管的目的。

本人的專案經驗為使用Team Foundation Server 工具控管 source code,SVN 作spec、專案流程及架構等控管,分為2部分控管不僅不易混亂,專案負責不同部分的人員也便於更新和取得屬於自己部分的資料。

版本控制基本用詞

這裡介紹幾個使用版本控制系統時必須了解的基礎觀念,包括:

‧檔案庫(repository)
‧工作區(workspace)
‧取出檔案(checkout)
‧送交檔案(commit)
‧分支(branch)

建立SVN 使用環境( 存放table \spec\resource等更新版本)

一、搭建SVN之前先做好準備工作

1.獲取 Subversion:到官方網站(http://subversion.tigris.org/)下載最新的伺服器安裝程式。目前最新的是1.7.6版本,主要可分為(Windows 32-bit / Windows 64-bit) 2種版本。具體下載位址在:http://subversion.tigris.org/servlets/ProjectDocumentList?folderID=11151&expandFolder=11151&folderID=11147

2、獲取 TortoiseSVN 用戶端程式:從官方網站 http://tortoisesvn.net/downloads 獲取最新的 TortoiseSVN 。TortoiseSVN 是一個用戶端程式,用來與 subvers 伺服器端通訊。Subversion 自帶一個用戶端程式 svn.exe ,但 TortoiseSVN 更好操作及更能提高效率。

二、搭建環境與安裝用戶端

安裝 Subversion(以下簡稱SVN)的伺服器端和用戶端。下載下來的伺服器端是個 zip 壓縮包,直接解壓縮即可,比如我解壓到 D:\commonLib。用戶端安裝檔是個 exe 可執行檔,直接運行按提示安裝即可,用戶端安裝完成後提示重啟。

三、建立版本資料庫(Repository)

運行Subversion伺服器需要首先要建立一個版本資料庫(Repository)。版本資料庫可以看作是伺服器上集中存放和管理資料的地方。

開始建立版本資料庫。首先建立 f:\svn 空檔夾作為所有版本資料庫的根目錄。然後,進入命令行並切換到subversion的bin目錄。輸入如下命令:

svnadmin create F:\svn\repository

此命令在 F:\svn 下建立一個版本庫 repository。repository下面會自動生成一些文件夾和文件。

我們也可以使用 TortoiseSVN 圖形化的完成這一步:

先建立空目錄 F:\svn\repository,注意一定是要空的。然後在 repository文件夾上“右鍵->TortoiseSVN->Create Repository here...”,然後可以選擇版本資料庫模式,這裏使用默認的FSFS即可,然後就創建了一系列文件夾和文件,同命令行建立的一樣。

四、啟動SVN伺服器

此時 subversion 服務還沒有開始,只是通過它的命令建立了版本資料庫。繼續在剛才的命令視窗輸入:

svnserve.exe --daemon

svnserve 將會在port(3690) 等待請求,--daemon(兩個短橫線)選項告訴 svnserve 以守護進程方式運行,這樣在手動終止之前不會退出。注意不要關閉命令行視窗,關閉視窗會把 svnserve 停止。

為了驗證svnserve正常工作,使用TortoiseSVN -> Repo-browser 來查看版本庫。在彈出的 URL 對話方塊中輸入:

svn://localhost/svn/repository

點 OK 按鈕後就可以看見 repos1 版本資料庫的目錄樹結構了,只不過這時 repository是個空資料庫。

你也可以使用--root選項設置根位置來限制伺服器的訪問目錄,從而增加安全性和節約輸入svnserve URL的時間:

svnserve.exe --daemon --root drive:\path\to\repository

以前面的測試作為例,svnserve 將會運行為:

svnserve.exe --daemon --root f:\svn

然後TortoiseSVN中的版本資料庫瀏覽器URL縮減為:

svn://localhost/repository

五、配置用戶和許可權

用筆記本編輯器打開F:\svn\repository\conf目錄,修改svnserve.conf:
將:
# password-db = passwd
改為:
password-db = passwd

即去掉前面的 # 注釋符,注意前面不能有空格。
然後修改同目錄的passwd檔,增加一個帳號:
將:
[users]
# harry = harryssecret
# sally = sallyssecret
增加帳號:
[users]
#harry = harryssecret
#sally = sallyssecret
test = test

六、初始化導入

下面就是將我們的資料(專案)導入到這個版本資料庫,以後就由版本資料庫管理我們的資料。我們的任何改動都會被版本資料庫記錄下來,甚至我們自己丟失、改錯資料時版本資料庫也能幫我們找回資料。

比如,我在 d:\wwwroot 下有個 book 檔夾,裏面存放的是我編寫的留言簿程式。在此文件夾上“右鍵 -> TortoiseSVN -> Import...” ,在彈出對話方塊的“URL of repository”輸入“svn://localhost/repository/book”。在“Import message”輸入“導入整個留言簿”作為注解。

點 OK 後要求輸入帳號。我們在用戶名和密碼處都輸入 test 。完成後 guestbook 中的內容全部導入到了 svn://localhost/svn/repository/book 。

我們看到在 f:\svn\repository沒有任何變化,連個 book 檔夾都沒有建立,唯一的變化就是f:\svn\repository容量變大了。實際上我們原book檔中的內容已經導入 repository版本資料庫了,原本的book 檔案夾可以刪除了。

需要注意的是,這一步操作可以完全在另一台安裝了 TortoiseSVN 的客戶機上進行。例如運行svnserve的主機的IP是192.168.121.22,則URL部分輸入的內容就是“svn://192.168.121.22” 。

七、基本操作流程

1.取出(check out):取出版本資料庫到一個工作區備份-來到任意空目錄下,比如在F槽建立一個空檔夾 f:\work 。“右鍵 -> SVN Checkout”。在“URL of repository”中輸入“svn://localhost/svn/repository/book”,這樣我們就得到了一份 book 中內容的完整備份檔。

2.存入(check in)/提交(commit):在工作備份中作出修改並提交-在 book 工作備份中隨便打開一個檔,作出修改,然後“右鍵 -> SVN Commit... ”。這樣我們就把修改提交到了版本庫,版本庫根據情況儲存我們提交的資料。

在修改過的檔上“右鍵 -> TortoiseSVN -> Show Log” ,可以看到對這個檔所有的提交。在不同的 revision 目錄上“右鍵 -> Compare with working copy”,我們可以比較工作區的檔案和所選 revision 版本的區別。

建立TFS 使用環境(存放編輯 source code)

從MSDN 中下載 Team Foundation Server 2010 來安裝,安裝步驟十分簡單,只要幾個步驟:

1.安裝 Team Foundation Server 2010 執行檔案,只要跑光碟中的 setup.exe,並按步驟跑完即可。
2.安裝 Team Foundation Server 2010 SP1,若使用的是 Windows Server 2008 R2 的話。
3.啟動 TFS 組態工具 (Configuration Tool)。
4.依組態工具指示設定。

為了要能夠支援在工作室外的開發用筆記型電腦,必須要有一台 TFS Server 對外,而 TFS 網路環境如圖:


《圖一》


如果環境中同時存有 Visual Studio 2005, 2008 和 2010,對 Visual Studio 2010 來說沒什麼,但 Visual Studio 2008 和 2005 若要支援 TFS 2010 的話,還必須安裝 Visual Studio Forward Compatibility Update 更新檔才行,而且如果原本並沒有安裝 Team Explorer 的話,整個 Visual Studio 安裝基本上要全部重跑 (安裝 Team Explorer,安裝 Service Pack,安裝 Forward Compatility Update),然後才能在 Visual Studio 2005, 2008 中使用 TFS。

遇到的問題

許多使用者可能必須在連線至 Team Foundation Server 2010 時繼續使用 Visual Studio 2008 用戶端,但是 Visual Studio 2008 無法使用 Team Foundation Server 2010 中的幾項功能。

解決方法

Visual Studio Team System 2008 的更新可以讓 Visual Studio 2008 用戶端執行某些案例,就如同在舊版伺服器上執行一般。您可以從以下位置下載 Team Foundation Server 2010 互通性的 Visual Studio Team System 2008 往後相容性更新:
http://www.microsoft.com/downloads/details.aspx?displaylang=en&FamilyID=cf13ea45-d17b-4edc-8e6c-6c5b208ec54d

如需在不進行更新的情況下在 Team Foundation Server 2010 上使用 Visual Studio Team System 2008 SP1 用戶端的體驗摘要,請造訪以下部落格網站:http://go.microsoft.com/fwlink/?LinkId=151314

如需此更新支援之案例的說明,請造訪以下網站:http://go.microsoft.com/fwlink/?LinkID=165503

TFS 的版本控管除了可以用 Visual Studio 2010 連接 TFS 外,也可以下載免費的 Microsoft Visual Studio Team Explorer 2010 進行版本控管,如果要透過類似 TortoiseSVN 這種 Windows Shell 的介面在檔案總管理操作,也可以安裝 Team Foundation Server Power Tools 就能使用這些功能。

SVN 功能實作

1.如果只有在個人電腦上運作,那就只需安裝TortoiseSVN就夠了,首先安裝完主程式,然後接著安裝中文化,裝完再重開機即可。

2.SVN運作需要一個資料庫,他一個資料庫管的就是一份專案,你可以把他想成他同一個資料夾,這樣比較單純。例如我今天要控管一個資料夾叫做homework,我建立一個D:\SVN資料夾,裡面建立資料庫去控管homework裡面的資料和檔案。


《圖二》


3.在D:\SVN裡面,點選右鍵=> TortoiseSVN=>在此建立檔案庫。然後到你要控管的homework,假如homework裡面已經有兩個檔案了,你在homework資料夾裡面點選右鍵=>SVN取出,然後檔案庫URL就去選取file:///D:/SVN,這個步驟是一開始要做的,他就會在homework裡面建立svn控管的資料,因為這時你的資料庫尚未有資料送上去,所以SVN取出不會有檔案取出的動作。


《圖三》


4.將homework裡面的資料夾送到SVN作紀錄,就在homework資料夾裡點選右鍵=>SVN送出,就會問你哪些檔案要送出,上面還可以打註解,確定之後,這樣就算是新增一個版本了。


《圖四》


5.以上基本動作完成之後,SVN裡面應該已經有版本1了。如果你去修改homework裡面的檔案,不管新增刪除修改都一樣,只要確定改到一個階段,就可以點選右鍵=>SVN送出,將最新的送到SVN作管理。千萬改完別選SVN更新,不然剛剛修改的部分會不經意的全部消失掉。

下面兩圖綠色打勾的檔案夾為有更新成功的顯示;紅色驚嘆號的檔案夾顯示因某種原因,此檔案夾未能更新到最新版本,須檢查其log 將失敗原因排除,才能更新繼續使用。


《圖五》


6.假如你在開一個temp的新資料夾在任意地方,也是要用來讀取homework裡面的東西,就在temp裡面點右鍵=>SVN取出,然後檔案庫URL在指向file:///D:/SVN,這樣的話他會將最新的homework版本複製一份到temp,當然這通常都是在遠端的時侯才會這麼作。


《圖六》


7.把握兩個原則,資料夾裡面,要先SVN取出(這動作會建立svn相關資訊),如果資料夾裡面是最新版本,比SVN DB更新的話,就選SVN送出。如果資料夾裡面是空的,或是資料夾裡面檔案版本較舊,就選SVN更新(更新到最新版)。把握這幾個原則基本上控管沒什麼大問題。

8.至於要怎麼回復至其他舊的版本呢?在資料夾點選右鍵=>TortoiseSVN=> 顯示紀錄,他會顯示你每次版本做了哪些更動,下面更可以開啟來看。如果要針對檔案回復的話,就點該檔案按右鍵,然後儲存版本。如果要整個資料夾回復,在資料夾點選右鍵=>TortoiseSVN=>更新版本至版本,然後填上版本數字,就好了。不用怕回覆到不想要的,因為SVN每個版本都有作儲存控制,你有SVN送出就一定會有新的版本。


《圖七》


(待續.....)