文、張明泰老師

D006.jpg  

 


• 為何使用 Subversion(版本控制系統) ?
o 以前在寫程式的過程中,如果只是寫個小程式且是一個人寫通常程式備份及分版本的方式就是 copy or zip 壓縮,加上日期就是個版本。這方式簡單易懂,但有當程式變大,寫程式的人員增加,很多麻煩的事情就會跟著發生。多人開發時總會每隔一陣子會有個人因為不知名原因手殘覆蓋到別人的檔案,程式碼過幾個星期沒看,就不知該如何維護且之前曾經發生什麼事也都忘了(因為都沒寫註解或懶得寫)。當然還有其他更多類似的悲劇發生……
o 把程式碼或文件檔案用一套系統做有效的管理,可以讓多人協同開發程式或撰寫文件並且可以隨時回復取得以前某個時期的版本,減少程式人員的掉髮這可能不失為一個好方法…..目前常用的開放原始碼版本控制系統有 subversion(http://zh.wikipedia.org/wiki/Subversion)、GIT(http://zh.wikipedia.org/wiki/Git) 及 mercurial(http://zh.wikipedia.org/wiki/Mercurial)等,各版本都有他的優缺點,這裡以 SVN 這個簡單好用資源多的版本控制系統來做簡單的說明。


Subversion 的基本概念
• 使用 Subversion 的基本概念
o SVN Repository:簡單來說 Subversion 是提供一個儲存庫(repository)及眾多存取管理工具,讓你將程式碼及檔案文件放入這個地方集中控管,每個人需要取用或更新程式碼都透過對這個儲存庫做存取,達到版本控制的功能。在這個 Subversion 架構中,需要一台提供儲存庫(repository )服務的伺服器並且能夠讓其他標準的 Subversion 客戶端工具夠過 ssh ,http , https or SVN 等通訊協定連接到這個儲存庫存取。目前也有一些開放原始碼的專案平台(ex:google code)提供免費儲藏庫的服務。
o SVN Client:在客戶端上通常都是以 svn 為客戶端用的指令,目前已有很多版本的圖型化 SVN 工具可以選擇。
o 工作區(Workspace):通常我們會從檔案庫中取出一分自己需要的檔案到本機的硬碟裡稱為本地端副本,通常也就是我們工作的目錄(working directory)。
o trunk: 主樹幹, 主要開發的程式碼都由在 trunk 。
o tags: 想要 Release 版本的時候就做個 Tags 就可以 Release 了。
o branches: 分支,當你可能需要某幾個程式做測試可以建立一個分支來做測試,測試完成在 合併(Merge) 回來。
• 定義一個簡單的開發規則,並且讓大家依循這個規則開發。

0306pic0000  
1. 取得內容可以使用 svn checkout 指令,或是 svn update 更新目前的內容
2. 新增變更檔案 svn add , svn delete , svn move
3. svn status 看目前檔案結構跟SVN上的版本有哪些不一樣
4. svn update 更新本地端的副本
5. svn merge 合併程式碼
6. svn commit 提交修正(簡單的會自動判斷合併)


提供 SVN 服務的平台
• 提供 SVN 服務的平台
1. http://code.google.com Google提供的開發平台
2. http://www.openfoundry.org 中研院提供的開發平台
提供版本管理服務的免費平台
提供服務者 支援的版本控制系統 註冊或授權條件
Google cvs,svn,git,mercurial 開放原始碼免費
中研院 cvs,svn 開放原始碼免費
• 更多的話請見 http://www.ibiblio.org/fosphost/exhost.htm
• SVN 的伺服器及客戶端工具取得
o Subversion 在 2009年開發公司捐給了 apache 基金會並且以 BSD 授權提供給任何人使用,於是在 http://subversion.apache.org/ 可以看到所有以這原始碼自行開發附加功能的各種版本(http://subversion.apache.org/packages.html#windows)。


SVN 伺服器端 VisualSVN Server
• 這裡我選擇以 VisualSVN 提供維護的 VisualSVN server for windows 來做為 SVN 的伺服器。這個版本同時也包含 Subversion 客戶端的文字介面工具。
• 檔案下載:http://www.visualsvn.com/server/download/
• visualsvn安裝畫面
0306pic0001  
• 選擇安裝管理工具及Server

0306pic0002  
• 選擇 Visualsvn server 提通 http(port 80) 及 https(port 442) 兩種連線方式,但這裡要請將 port 修改為其他連線 port 避免與標準的通訊連線阜號衝突。
• Authentication(認證)請選擇 Subversion 自行提供的認證自行建立使用者帳號及密碼(預設為 htpasswd 的格式),付費版本有提供 AD 整合 SingleSingOn 的服務。

0306pic0003  
• 裝好後就如下面畫面,右半部畫面清楚的顯示目前這個 Server 的相關資訊。

0306pic0004  
• 使用滑鼠右鍵就可以建立新的儲存庫。

0306pic0005  
• 先建立一個測試用的儲存庫(Repositories) 名稱為 test ,路徑是:https: / /本機名稱:8443/svn/test/
0306pic0006  
• 接下來在建立一個使用者帳號,用來存取這個儲存庫。
0306pic0007  
SVN 客戶端工具 Tortoisesvn
• 有 TortoiseSVN 這套很好用的的圖型化工具可供選擇,他結合了檔案總管可以使用滑鼠右鍵選單就可以啟用 SVN 的各項功能。

0306pic0008  
svn import
• 第一次使用 SVN 的時候因為整個 Repo 是空的,第一次建立通常使用 import 先將目前的資料整批的匯入。
• 我先建立個目錄 test ,在裡面建立各檔案 hello.html 內容如下:

0306pic0009  
• 把這個檔案 import 到 svn server 這個 test 的儲藏庫內。

0306pic00010  
• 提供 SVN 的路徑,及需要記錄的訊息內容。
0306pic00011  
• 因為我們選擇的是 https 所以會出現憑證確認的詢問畫面,選擇第一個允許即可。
0306pic00012  
• 輸入帳密。

0306pic00013  
• 完成,並給予修訂的版次。
0306pic00014  
• 以上動作是只有第一次使用的時候整批匯入才會用到。
• 回到 SVN server 就會看到 trunk 目錄下這檔案已經被匯入了。

0306pic00015  
svn checkout
• 底下範例為建立一個空的目錄 test_jangmt 並且透過 checkout 的功能取得最新的版本。
0306pic00016  
• 輸入另一個使用者 jangmt 認證資訊。

0306pic00017  
• 取得最新的版本,目錄出現打溝溝的符號。
0306pic00018  
svn commit
• 當我們對程式碼修改的時候,可以透過 commit 提交到儲存庫上面成為一個新的修訂版。
• 當此目錄有修改過的文件目錄會必成紅色的驚嘆號。
0306pic00019  
• 按右鍵選擇 svn commit。
0306pic00020  
• 輸入 message 說明這次 commit 的變動。
0306pic00021  
• 上傳並且得到新的修訂版次 3。

0306pic00022  
• 如果你仔細觀看 svn showlog 他會顯示已經合併程式碼的紀錄出現。

svn update
• 當 svn 儲存庫上面有新的版本,我們只要執行 svn update 指令就可以取得最新的版本到目前的工作目錄上面。
0306pic00023  
svn add
• 當你的工作環境需要增加一個檔案,可以先把檔案在工作目錄中建立好。使用 svn add 將檔案上傳上去,點選後檔案前面的圖示會變成有個 + 的符號,在下次 commit 的時候就會將這個檔案上傳到 svn 儲存庫中。

0306pic00024  
• svn commit 上傳

0306pic00025  
衝突的發生
• 當兩個不同的使用者,用相同的檔名上傳到同一個儲存庫,系統無法正確判對到底誰是對的所以後來的 commit 就會被檔掉無法更新。

0306pic00026  
• 錯誤記錄。

0306pic00027  


svn tags/branches
• 如果遇到這樣的問題可以先用開分支或是 tags方式,先複製出工作副本到 tags或是 branches 內,進行自己的版本開發可以以原本的 trunk 內的版本為基礎,進行自己想要的測試。
0306pic00028  0306pic00029  

• 當然在本地端的工作副本也要開個新的以利區隔。
0306pic00030  
.svn 目錄
• 每一個工作複本的目錄都有名為 .svn 的子目錄,該目錄是隱藏目錄。它是一個相當重要的目錄,Subversion 靠它來管理你的工作目錄上的版本。
SVN hooks
• 當我們很高興的完成了上面的設定,但是發現目前的系統是一個網頁程式我希望能將最新的修改放到網路上去,但這必須要每次都到 web server 的所在目錄使用 svn update 更新才可以取得最新的版本,這很麻煩。因為通常在版本管理的過程中,對於使用者登入系統這件工作是希望越少越好,所以 svn 提供一個 hooks 的功能可以在 commit 時同時執行一個 shell script 來完成 svn update 的工作。
• 關於 svn hooks 通常提供底下幾種事件狀況:

0306pic00031  

• 這個目錄以 virtualsvn 通常是放在 C:\Repositories\test\hooks 底下,內容預設為 linux 上面的 shell script 附檔名為 .tmpl 為不可以執行的,如果 windows 版本需要使用,需要編寫為附檔名為 .bat 型態的批次檔放在這裡。
• 於是我打算將目前 test 的儲存庫的 trunk 版本的最新版放到本機負責 web 呈現的目錄 C:\Users\mtchang\website\svn\test_web 。
• 在建立 svn hooks 之前請先設定好 web 目錄的 svn checkout 資訊,讓目錄產生 .svn 的目錄以方便取用遠端的資訊。
• 在 C:\Program Files (x86)\VisualSVN Server\bin\ 及 C:\Program Files\TortoiseSVN\bin\ 都有 SVN 的客戶端工具可以使用。
• 寫個 C:\Repositories\test\hooks\post-commit.bat 的批次檔在這個路徑下,內容類似如下:
"C:\Program Files\TortoiseSVN\bin\svn" update C:\Users\mtchang\website\svn\test_web\ --username svn --password 0000 --no-auth-cache --non-interactive --trust-server-cert
• 語法請見 svn help update 說明
• 這段功能因為預設的版本為 linux shell 的版本,如果需要 windows 版本需要自行調整指令,不是每個版本都可以正常工作。
• 詳細可用 post-commit hooks 關鍵字查詢可以得到很多人提供他們可以工作的批次檔案。
• Windows 需要注意寫入權限,post-commit hooks 執行應該是以使用者權限執行的,所以目錄需要有一般使用者可以寫入的權限才可以正確工作。
參考
• http://twpug.net/docs/Subversion SVN 中文文件
• http://subversion.apache.org/packages.html#windows 下載 SVN
• http://blog.longwin.com.tw/2007/07/svn_tutorial_2007/ SVN 基本指令教學
• http://www.ibiblio.org/fosphost/exhost.htm 自由軟體主機服務列表
• http://hi.baidu.com/zwfec/blog/item/0af4942f978f73221e308949.html

2011-10-14-blog.gif  

arrow
arrow

    聯成電腦 發表在 痞客邦 留言(1) 人氣()