這個月阿猩忙著交接上一份工作,網誌停止更新了將近一個月,這禮拜終於正式進入新公司了(灑花)。最近一部分的工作就是看文件理解專案現況,目前專案文件更新及溝通是使用SVN,輸入網址就可以逐一下載檔案,但總覺得這樣工作效率很低,今天就一起來練習使用SVN吧!
基礎概念
SVN概念
如果完全沒用過版控工具的人,可以暫時把Subversion(簡稱SVN)想像成是FTP,當多人工作的情境下,可以將資料上傳至統一的路徑,也可快速下載先前的檔案。但FTP的缺點是,下載整包檔案後,工作了一段時間,很難知道這段期間內,被異動(如刪除、更新等)的檔案有哪些,或是哪個同事做了些什麼工作。而SVN是一個開放原始碼的版本控制系統,除了有共通的檔案,任何人的異動都會被記錄下來,因此可以進行版本控管,如果有檔案被刪掉或無法挽救,可以回到正常work的版本,再重新工作。
SVN與Git
SVN與Git都是版本控制系統,不同的是SVN屬於集中式版本控制,而Git是分散式版本控制。二者如同FTP的概念,需要透過網路連線,上傳檔案至遠端存放的倉儲(Remote Repository),Git多了Local Repository。如果網路無法連線,Git能在本機進行版本紀錄,待網路連線成功後,再發布新的版本至Remote Repository。SVN在無法連線的時間內,因為SVN沒有Local Repository,就會完全沒有版控的功能,要Commit也得Server管理者開通權限。但管理上相對簡單,合併的衝突也會相對少,就看專案情況使用囉。根據不同作業系統或習慣,可選擇不同套SVN工具,阿猩這裡會使用的是TortoiseSVN。
SVN Server建立
安裝SVN Server
要開始測試前,肯定要先建立一個Remote Repository,但架立SVN Server會有很多額外的工作要做,我們這裡直接使用Visual SVN,選擇下載VisualSVN Server,一路下一步到底,就安裝完成啦(圖1)。
建立使用者
完成安裝後,需要手動新增SVN使用者(圖2、圖3)。


建立Repository並決定使用者權限
建立Repository(圖4-圖8),後續再分別對個別的Repository設定使用者操作權限(10-13)。










SVN 操作說明
安裝TortoiseSVN
上個步驟我們建立了SVN Server,實際的工作況狀,SVN Server不可能建立在本機上,所以我們只會拿到URL。要開始測試前,我們還要另外安裝TortoiseSV,安裝後才能執行一些本機操作功能,如Commit等。一樣一路安裝到底,這裡就不贅述了。
模擬真實狀況進行測試
1 - CheckOut
阿猩模擬了SVN使用情境,建立3個資料夾分別代表不同角色。SVN Server管理員建立好SVN Repository後,可能會上傳基本文件。在SVN Server上建立一個空資料夾,並執行CheckOut(圖14),並將SVN Server Repository的URL設定好(圖15),這時候資料夾才算與Repository連接成功,成功畫面如圖16。


2 - 加入檔案
阿猩在資料夾中加入「初始建立該有的文件.txt」,這時候SVN Server上還是空的,需要進行Commit(圖17)。進入Commit後(圖18),需要(1)寫下要Commit的訊息; (2)選取要上傳的檔案。Commit成功後檢視檔案有出現既沒問題啦,透過瀏覽器或SVN Server Manager檢視檔案是否上傳成功(圖19)。
3 - 依樣畫葫蘆(員工1加入工作團隊)
建立員工1資料夾,阿猩為了示範,事前已建立好3個資料夾,實際使用只需要在自己的本機建立1個新資料夾,並執行CheckOut連接SVN Repository。成功的話,員工1的資料夾內,應該與SVN一樣,共1個檔案。員工新增了
「20210828_員工1_工作紀錄.txt」,一樣要透過Commit,將異動更新到SVN Server上。順帶一提,執行Commit其實包含了2個動作(Add與Commit),Add是加入索引,Commit才是發布版本。
4 - 依樣畫葫蘆(員工2加入工作團隊)
流程步驟3相同,若是照著阿猩的範例做,成功的話,員工2的資料夾內,共2個檔案。此時,員工2再新建「20210828_員工2_工作紀錄.txt」,執行Commit後,發現SVN Server與員工2都有3個檔案,但員工1只有2個檔案。故員工1需要執行Update(圖20),與SVN Server最新狀態同步。

※ - 合併衝突
假設員工1、2都修改了「20210828_員工2_工作紀錄.txt」,理論上來講員工1不該去動員工2的工作紀錄,但員工1很粗心,改到就算了,在Commit時,也不仔細挑選該發布的檔案,直接全部檔案發布到Server,員工2後續要Commit時,要先執行Update,就會因為SVN Server上的「20210828_員工2_工作紀錄.txt」與自己電腦上的內容不一樣,但電腦不知道哪個才是正確版,就會造成衝突。解決方案當然只能去看哪裡不一致,手動修改後再重新Commit,所以要Commit之前,真的要好好謹慎確認Commit的檔案有哪些。