Why Subversion?
先借用一下好同學 willie 的文章《專案管理:使用 Subversion (一)》,
看看為什麼我們非用 subversion 不可。
不曉得各位有沒有遇過這樣的情況:你因為某些因素需要和其他人一起開發程式 (可能是合作進行大學專題、或是一起接案子賺外快),而隨著開發成員越來越多,你開始陷入處理雞毛蒜皮的麻煩小事:
隔了一個週末,你的伙伴小明很高興的跑來跟你說:「我趁著這週末開發了一個超炫的功能,趕快來看看!!」好死不死,你在這週末也正在開發相關的程式,結果你們兩個同時修改到了好多重疊的程式碼。這下好了,要放棄你的修改,還是要放棄小明的修改 (小明聽到這消息應該會淚奔…)?喔,這時的確可以考慮使用 Winmerge 之類的程式來合併你們的變動,但是這還是很容易出錯 (因為動到的地方很多),而且在合併時你必須保持最佳的精神狀態,以免合併失敗。最糟的情況就是合併失敗 (極有可能一時眼花刪錯行了…),造成系統不能正常運行,這時你就只能和小明手牽手一起淚奔… (我好像還沒告訴你另外其他五位成員也在這週末大改了同一部分的程式碼…)
你說,這還不簡單,那就在當初分工時依照功能分配給不同的開發人員,這樣就不會改到同一份程式碼啦?喔?那看看以下情況:
再兩個週末,你就要把第一版的程式交給客戶,剩下的時間,大家都在修正程式碼、除錯、美化介面,好讓系統看起來完美一點。但是你現在想要開發一個酷炫的功能,這個功能一但開發出來,客戶躺著都可以賺錢,客戶一定會很想要。但是這個功能非常複雜,不但會動到系統核心的功能,更重要的是你不確定到底能不能在兩個禮拜內開發出來。萬一要是沒寫出來,最糟的情況就是讓客戶看到一個完全不能用的半成品系統…。
當多人一起開發系統時,遇到的問題絕對比以上這些情況還要複雜,若沒有一個工具可以幫我們來解決類似的問題,那這樣隨著開發人員越來越多,產能也會非常低落 — 因為你把時間都拿去處理這種事情了。而這也是為什麼需要使用版本控制系統的原因。
從 willie 舉的例子,我們可以感覺到管理程式碼、處理合併變動……
這些枝微末節的小事總是十分煩人,那麼要怎麼面對這種苦惱呢?
沒錯,就是祭出 subversion 來幫你忙,再也不必擔心自己瞎忙半天卻什麼也處理不了。
課程投影片
可以上 Google 查 subtrain,可以找到 Polarion Community,
下載其中的 SVN_User_Training_Tortoise.zip
或者直接到下列連結下載:
http://www.polarion.org/index.php?page=download&project=subtrain
這份投影片中只介紹了 Windows 的 svn 圖形介面軟體 Tortoise,
如果需要知道 svn server 如何架設等,可以連其他的一起抓下來看。
==========開始講的分隔線==========
從架構圖中可見,SVN client 有兩種連結使用的方式,
一種是 command line,在 Linux 上常用;
但因為 Windows 上使用 command line 反而不方便,
通常是用 GUI client apps,而 Tortoise 就是一個GUI client app。
server 可視個人需求而定,可以在本機上面自己架版本控制,
若 server 架在其他機器上,還可以發揮異地備援的功效。
一般 server 端會搭配 apache,client 就以 http 連接到 server。
一個專案檔下可有 trunk, tags, branches 目錄(非必備)。
這些資料夾是拿來分類程式碼的發展版本用的。
trunk: 放置當前程式開發進度,可能是非穩定版本;
tags: 放置穩定版本的資料;
branches: 準備發佈的版本,但有 bug 待修,修訂完畢後可以 merge 到先前版本。
revision number 即每次上傳的版本編號,
每個專案的 revision number 是獨立的,新建立的 project's revision number 都是 0 開始,
這個編號在每次上傳會一直增加,是作為日後版本對照時的依據。
每次上傳都一定是整批上傳,若上傳過程中間斷線,就會整批都上傳失敗,
因此在 svn 上的版本必定都是完整的。
Windows 使用者可以安裝 Tortoise SVN:
http://tortoisesvn.tigris.org/
當中的 Download 可下載 Tortoise SVN 程式,安裝後電腦裡就有 svn client 功能了。
第一次上傳 project 到 repository 時,
要先讓 svn 認得現有的檔案,因此必須做 import,
右鍵→import→http://server name/svn/project name。
把檔案 import 時會要求認證,輸入剛才建立專案時的名稱與密碼,
檔案就會上傳一份到 server 端,
接下來再 checkout 在 server 上的版本,就得到一份包含了版本控制資料的檔案,
可以看檔案的圖示上有沒有綠色打勾的圖記,若有就表示檔案已受 Tortoise SVN 的版本控制。
若有現有修訂,要把檔案右鍵→ commit →送到 server上。
建議 Message 要寫清楚,日後追蹤修訂才方便。
也建議在整個專案完成一部分時再 commit,以免 subversion 中充滿無意義的 log。
專案中若多了新的檔案,可以發現新的檔案圖示上沒有綠色打勾的圖記,
因此要對檔案按右鍵→ add →送到 server 上,讓它也受版本控制。
add 成功後,圖片左下角會出現加號,但此時還沒有送到 server 上,記得要 commit。
專案中的檔案若要刪除或更名,都必須右鍵→ rename/delete,
這樣之後的版本控制才會準確無誤(否則直接刪除或更名會造成 Tortoise 出現錯誤訊息)。
若要在本機做版本控制,開一個資料夾後右鍵→Create Repository Here,
資料庫格式可任選,按下 OK 後就可以在該處建立本機的版本控制資料庫。
路徑可以使用檔案總管尋找,找到剛才建的資料夾後把資料 commit 到該處。
備分時直接備分這整個資料夾就能備分所有的版本控制資訊。
每個資料夾都可以視為是一個獨立的專案 (project)。
介紹一下直接右鍵就有的其他功能。
Check for modification: 檢查有哪些檔案有異動。
Diff: 比對兩個檔案之間修訂的差異何在。若想要把兩個衝突的檔案修訂成一樣的,
可以選取兩個檔案後右鍵→Diff,左邊的將會成為主文件,
若想將右邊的檔案與左邊的修訂成相同內容,可以點選該行後選擇 use this text block,
則左右兩份文件中該行的內容就會相同(右文件中的內容會被左文件同化)。
Revert: 復原,可回復到上一版本。
右鍵按著不放的特殊技能則是 Coping/Moving。
若要把檔案複製到其他資料夾中,按住右鍵拖曳檔案到目的資料夾後放開,
可以看到SVN Move versioned files here等功能可選擇,
如此一來移動或複製的記錄也會存在 SVN 中。
若想 rename/move/delete/copy/create directories,
最好都透過 SVN 達成,才不會出現意外的錯誤。
若想要讓資料夾不再受版本控制,只要把 .svn 資料夾刪掉就可以了。
編修衝突 (edit conficts)
在 team work 中可能會有同時編修而導致版本衝突的情況發生,
此時可以對發生衝突檔案的使用右鍵中的 Edit Conficts 編修衝突。
編修過程中可以選擇要將衝突的部分選用哪一方的內容,最終的結果可在 merge 的視窗中預覽。
整個檔案 merge 完成後,再按右鍵→ Resolved 解決衝突。
鎖定 (locking)
在團隊合作開發專案時,
希望檔案不要在同時受人修改、以免後續又要編修衝突。
右鍵→Get Lock 之後,輸入要鎖定的原因。
在設定 Lock 的人 release lock 之前,其他人都無法 commit。
若完成後,再 Release lock,其他然就可以繼續 commit。
但使用時要小心,若設定 lock 的人沒有解除,會影響其他人的 commit。
lock 設定後,其他人 checkout & update 的結果是看不到檔案有無鎖定的,也會造成困擾。
建立分支與標記 (branch/tags)
對 trunk 資料夾右鍵→ branch/tags,建立分支版本。
例如:
http://server/tags/v1.0
這樣一來會複製目前 trunk 裡面的內容到 tags 資料夾,
tags 裡就是穩定版本,我們可以繼續修改 trunk 裡面的內容,
而已發佈的穩定版本不會受影響。
合併 (merge)
若已 release 1.0 版本,想要再修當中的 bug,
可以先建 branch 出來,拿 branch 中的內容修改,
修改後再 merge 回先前的版本。
右鍵可以看版本圖瞭解分支的情況:右鍵→Revision graph。
重新定位 (relocate)
如果 repository 換位置了(例如:建在本機的 repo. 磁碟機異動位置,或是 server 改 IP),
可以使用 relocate 重新指定正確的路徑。
專案管理過程中要注意把 ticket/issue/bug ID 記錄進去版本管理中。
以 ticket ID 為例,在 trac 中,傳送使用者回報的每個訊息都叫 ticket,
若有針對該 ticket 做的變更,應該將之記錄起來,才能掌握有哪些已修改或未修改。
資料夾中若有新檔案不想要加入控管,可以右鍵→Add to ignore list,
例如對單一檔案設定該檔案忽略掉、不要受版本控制;
若是所有 *.jpeg 都不想接受控管,可以設定條件為 *.jpeg。
使用 Eclipse 的人可以搭配 Fasttrack,有點類似 trac 但僅可配合 Eclipse 使用。
留言列表