講解 Subversion 分支與合併:以 TortoiseSVN 為例

在實務的版本控管情境中,套用分支與合併應該是最方便不過的了,會用的人可以得到許多版本控管的好處,但不會用的人卻會因為不理解而害怕使用它,由於 Subversion 1.5 開始新增了 Merge Tracking 功能,可有效降低維護分支的負擔,所以能學會分支與合併的技巧對整個版本管理流程來說會有非常大的幫助,今天我就來講解幾個利用 TortoiseSVN 實際的操作分支與合併的例子。

如下圖是一個很常見的分支示意圖,當你想在 trunk 發展一個新功能時,你可以透過 svn copy 的方式將整個 /calc/trunk 廉價複製/calc/branches/my-calc-branch,當 /calc/branches/my-calc-branch 分支完成所有新功能開發後,再將所有變更一次合併回 /calc/trunk 開發主線。

我講的 svn copy 其實就是對應到 TortoiseSVN 的 Branch/tag 功能

 

使用時應注意以下:

  1. 你要廉價複製的來源路徑
  2. 你要廉價複製的目的路徑 (「複製」就等同於「分支」,這是 SVN 附加上去的意義 )
  3. 寫下你為什麼要建立這個分支、用途是什麼,這訊息可以給團隊成員或版本經理看
  4. 我們可以在執行 Copy (Branch/tag) 的同時順便將你的「工作目錄」切換至「分支的路徑」

這時我們可以看一下 trunk 這個目錄的屬性,並切換至 Subversion 頁籤,你會發現該「工作目錄」所對應到的 Subversion 路徑已經變更到 /calc/branches/my-calc-branch 了。

但為了怕初學者混淆,我還是先將 /calc/trunk 切換回原本的 SVN 路徑:

這裡有幾點注意:

  1. 這裡是你的「工作目錄」(Working Copy)
  2. 這裡才是你要將「工作目錄」切換到的 SVN 路徑,也就是將 /calc/branches/my-calc-branch 切換至 /calc/trunk 路徑

這時你便可以開始在 /calc/branches/my-calc-branch 發展你這次想要新增的功能,且不會影響到其他團隊成員正在發展或維護的 /calc/trunk 開發主線。

也許過了一段時間,原本的 /calc/trunk 開發主線可能已經有其他團隊成員陸續修正了一些 Bugs,但這時你的分支 /calc/branches/my-calc-branch 就可以直接套用 開發主線 ( /calc/trunk ) 的更新,除了避免重複的工作外 (重複除錯),也可以避免版本的衝突發生,因為兩個人改同一個已知的 Bug 可能會因為用不同方法除錯或命名的方式不一致而發生衝突。

經常將 開發主線 ( /calc/trunk ) 的變更透過 svn merge 合併至 分支線路 ( /calc/branches/my-calc-branch ) 是一個非常好的習慣,這樣才不會讓你因為脫離 開發主線(trunk) 過久而導致將 分支線路 ( /calc/branches/my-calc-branch ) 合併回 開發主線 ( /calc/trunk ) 時發生許多版本衝突。

 

開發主線 ( /calc/trunk ) 合併至 分支線路 ( /calc/branches/my-calc-branch ) 通常選第 1 個,也就是 [Merge a range of revisions]

在 Merge 的視窗有以下注意事項:

  1. 設定要合併的來源,由於我們打算從 開發主線 ( /calc/trunk ) 合併分支這段時間所產生的變更至 分支線路 ( /calc/branches/my-calc-branch ),所以合併的來源要選擇 /calc/trunk 才對!
  2. 合併的結果會直接與目前「工作目錄」(Working Copy) 做比對,並修改目前工作目錄中的所有檔案。因此建議在做合併之前可以將所有尚未 commit 的檔案先 commit 到版本庫,避免不必要的衝突事件發生。

在正式進行合併(Merge)之前,建議先執行 Test merge 看看是否會發生什麼事!

若無異狀則可直接按下 [Merge] 按鈕進行合併動作,這時從 開發主線 ( /calc/trunk ) 分支出來的到目前工作目錄的版本就會做個比較,然後直接套用變更到你現有的檔案、目錄或屬性裡。

在合併之後如果沒有發生衝突,不代表真的沒衝突,所以必須再次對原始碼做出驗證後才能 commit 進版本庫,建議可參考以下流程:

  1. 將專案進行建置(Build)
  2. 如果沒問題再對專案進行單元測試(Unit Testing)或手動測試(Manual Testing)
  3. 如果都沒問題再 commit 目前合併無誤的版本到版本庫!

最後我們的 my-calc-branch 分支已經將新功能開發完成且測試無誤,所以要將 分支線路 ( /calc/branches/my-calc-branch ) 的最終版本合併回 開發主線 ( /calc/trunk ),這時的手續如下:

分支線路 ( /calc/branches/my-calc-branch ) 合併回 開發主線 ( /calc/trunk ) 通常選第 2 個,而特別選擇 [Reintegrate a branch] 這個選項是很重要的,因為這有以下好處:

  1. 讓 Subversion 能知道 開發主線 ( /calc/trunk ) 是從哪個分支、哪些版本合併進來的
  2. 有效節省 Subversion Repository (SVN儲存庫) 的空間,因為不用重複儲存分支的所有變更資訊
  3. 可以產生 Revision graph 得知專案開發的分支狀況

一樣可以先 測試合併(Test merge) 再正式進行 合併(Merge)

合併完後再將變更 commit 到版本庫

 

 

分支線路 ( /calc/branches/my-calc-branch ) 合併回 開發主線 ( /calc/trunk ) 並 commit 了之後,該分支就沒用了,Subversion 也不會繼續追蹤這個分支的變更 (因為之前已經 Reintegrate 過了),所以建議將該分支刪除。

刪除後要記得 commit 才能將「刪除動作」寫入到 Subversion Repository (SVN儲存庫) 中

 

以上就是一個 Subversion 分支與合併的完整過程,但有許多很細部的觀念我很難在一篇文章裡講清楚,如有時間建議多閱讀 Subversion 線上文件,當你建立起更多更完整的觀念後,對 Subversion 甚至是其他版本管理工具應該都能夠更加得心應手!

相關連結

  

此文章由 will 發表於 2010/1/29 上午 12:33:25

永久連結 | 評論 (7) | 此文章的RSSRSS comment feed |

分類: Subversion

標籤: , , , , , , ,

收藏:

如何升級 Subversion 儲存庫版本 (SVN Repository)

最近在整理一些舊專案 SVN 目錄時,發現了一些整理過的目錄無法取得之前的 LOG 資訊,而出現了以下圖示的錯誤訊息,這是因為 SVN 儲存庫太舊的關係,所以必須將 SVN 伺服器上的儲存庫一一升級,以下是我將 SVN Repository 升級的筆記。

 Querying mergeinfo requires version 3 of the FSFS filesystem schema; filesystem uses only version 2

兩種升級方式

  1. 透過新版的 Subversion 指令列工具執行 svnadmin upgrade
    1. 優點:執行速度快 ( 僅需幾秒鐘完成 )
    2. 缺點:無法最佳化儲存庫狀態,檔案空間無法節省
  2. 手動先將儲存庫匯出,建立新版儲存庫後再匯入
    1. 優點:重新匯出、匯入過的儲存庫為最佳狀態
    2. 缺點:執行時間冗長,且匯出時也挺佔磁碟空間

磁碟空間差別

我原本的儲存庫大小為 1.02 GB (1,104,493,696 位元組) 在利用 svnadmin upgrade 升級後目錄所佔用的磁碟大小其實沒多大變化,但若透過匯出再匯入之後的磁碟大小為 991 MB (1,040,049,771 位元組),節省了 61MB 左右 (好像沒差多少),至於在執行效能方面不確定有沒有差異。

我在匯出儲存庫時,原大小雖為 1.02 GB 但匯出後的 dump 檔卻有 2.00 GB (2,156,124,465 位元組)

升級方法 1:自動升級方式

svnadmin upgrade REPOS_PATH

以下列出 svnadmin help upgrade 的說明文字僅供參考:

C:\>svnadmin help upgrade
upgrade: usage: svnadmin upgrade REPOS_PATH

Upgrade the repository located at REPOS_PATH to the latest supported
schema version.

This functionality is provided as a convenience for repository
administrators who wish to make use of new Subversion functionality
without having to undertake a potentially costly full repository dump
and load operation. As such, the upgrade performs only the minimum
amount of work needed to accomplish this while still maintaining the
integrity of the repository. It does not guarantee the most optimized
repository state as a dump and subsequent load would.

升級方法 2:手動升級方式 ( 建議用自動升級的方式處理即可 )

首先,你必須先知道你的 SVN Repository 是哪個版本。

用記事本開啟 {REPOS}\db\format 檔案,此檔案內容只有一個數字,該數字就是 Repository 的版本。而各版本所代表的數字所對應的 Subversion 版本如下 ( 參考自 svn repository upgrade procedure ):

  • 1            Subversion 0.27 之前的版本 ( 包括 0.27 版 )
  • 2            Subversion 0.28 - 0.33.1
  • 3            Subversion 0.34 - 1.3
  • 4            (no released version used this)
  • 5            Subversion 1.4 以後的版 ( 包括 1.4 版 )

升級程序如下:

1. 先將目錄更名

ren myrepos old-repos

2. 利用舊版的 svnadmin 指令匯出儲存庫(Repository)

svnadmin dump old-repos > dumpfile

3. 利用新版的 svnadmin 重新建立 SVN 儲存庫目錄

svnadmin create myrepos

4.用新版的 svnadmin 載入先前備份的 SVN 儲存庫

svnadmin load myrepos < dumpfile

5. 將原 SVN 儲存庫的 hooks 指令檔複製到新版的 SVN 儲存庫中

copy old-repos/hooks/* repos/hooks/

:如果你用 BDB 格式,必須將 old-repos/db/DB_CONFIG 複製到新版的 db 目錄下

copy old-repos/db/DB_CONFIG repos/db/

相關連結

  

此文章由 will 發表於 2009/11/2 下午 02:45:44

永久連結 | 評論 (0) | 此文章的RSSRSS comment feed |

分類: Subversion

標籤: , ,

收藏:

如何利用 WinMerge 比對一般目錄與有 SVN 版本管理的目錄

當程式已經部署正式機後,線上的檔案難免會需要臨時調整,但過了一段時間後,就會慢慢開始遇到正式機的檔案與開發環境 SVN 版本庫中的檔案不一致的情況,把正式機上的檔案拉下來準備用 WinMerge 進行比對時,卻又有一堆 .svn 或 _svn 目錄的檔案混雜在一起,很不容易比對;若要再次匯出專案,有些專案的檔案多又大,這樣先匯出、再比對、再將變更的檔案同步回工作目錄(Working Copy)實在很沒效率,事實上 WinMerge 已經有內建 篩選器(Filter) 可自動略過這些不想比對的檔案或目錄!

先開啟 WinMerge 比對視窗 

開啟 WinMerge 比對視窗

設定兩個資料夾,並勾選 [包括子資料夾] 準備進行資料夾內容比對,最後點擊 [篩選器] 的 [選取] 按鈕

設定兩個資料夾,並勾選 [包括子資料夾] 準備進行資料夾內容比對,最後點擊 [篩選器] 的 [選取] 按鈕

然後在 [檔案篩選器] 的地方選取 [Exclude Source Control] 再按下 [確定]

然後在 [檔案篩選器] 的地方選取 [Exclude Source Control] 再按下 [確定]

最後再按下 [確定] 即可開始進行檔案比對

最後再按下 [確定] 即可開始進行檔案比對

開始進行目錄比對後,有兩種檢視方式,分別有不同的用途:

1. 樹狀檢視

  • 優點:清楚有哪些目錄下的檔案被變更,目錄結構一目了然。
  • 缺點:目錄多且檔案分散各地時,每次都要一直展開目錄很沒效率。即便有 [展開所有子資料夾] 的功能,單純想比對檔案差異時也不是挺方便的。

開始進行目錄比對後,有兩種檢視方式,分別有不同的用途:樹狀檢視 

2. 平面檢視

  • 優點:對於零碎的檔案可一一比對,不用顧慮有哪些目錄,可有效的專注於每一個目錄與檔案的差異比對。還可以依照畫面上各欄位進行排序,而不受目錄層級的限制。
  • 缺點:當不用「資料夾」排序時,比對檔案與目錄之間的關係比較麻煩。

 開始進行目錄比對後,有兩種檢視方式,分別有不同的用途:平面檢視

相關連結

  

此文章由 will 發表於 2009/10/14 下午 08:32:08

永久連結 | 評論 (1) | 此文章的RSSRSS comment feed |

分類: Tips | Subversion

標籤: , ,

收藏:

免費電子書:使用 Subversion 進行版本控制 (繁體中文版)

我們公司都是用 Subversion 作為所有專案的建構管理(版本控管),網站上可以下載到許多電子書可看,尤其是知名的 Subversion 与版本控制 就提供中文免費的電子書可供下載或線上閱讀,雖然中文的電子書無法與英文電子書即時同步最新的內容,不過 Subversion 的基本觀念基本上都大同小異,對新手上路的人來說已經非常足夠。

礙於 Subversion 与版本控制 只提供簡體中文的內容,對繁體中文的讀者來說有時在閱讀上會有些困擾,我今天花了好些時間將電子書的內容做了些調整,並推出繁體中文版的電子書,供有興趣學習的人下載學習。

目前網站上能下載到最完整的 HTML 格式的文件是 Subversion 1.4 版 (r2866),我針對這個版本進行繁簡轉換並修正用詞,以下我列出三個「相同版本、不同語系」的文件供各位參考,當中文看不懂詞義時可以隨時切換到「簡中版」或「英文版」進行交叉比對,讓你能夠快速理解文意。

由於官網已經不提供 chm 格式的文件下載了,我有從網路上下載到 Subversion 1.1 版的 CHM 文件,也一併翻譯成繁體中文,各位可於下列網址下載:

相關連結

  

此文章由 will 發表於 2009/9/5 下午 11:06:09

永久連結 | 評論 (8) | 此文章的RSSRSS comment feed |

分類: Subversion

標籤: ,

收藏:

修正 TortoiseSVN 在 Vista 無法使用右鍵拖曳選單的問題

TortoiseSVN 有一個很好用的功能,就是透過點選滑鼠右鍵拖曳 Subversion 工作目錄時會出現的選單 (如下圖示),透過這個功能可以很直覺的將 SVN 工作目錄移動複製更名匯出等動作。但只要將 TortoiseSVN 安裝至 Windows Vista 或 Windows Server 2008 不管是 32bit 或 64bit 都會遭遇到「無法看見滑鼠右鍵拖曳選單(right-drag context menu)問題」。

TortoiseSVN 有一個很好用的功能,就是透過點選滑鼠右鍵並拖曳 Subversion 工作目錄時會出現的選單 (如下圖示),透過這個功能可以很直覺的將 SVN 工作目錄移動、複製、更名、匯出等動作

這雖然不會影響工作很多,但卻會影響一些工作效率,也讓我困擾了好幾個月,我也與 TortoiseSVN 作者 Stefan 討論了數十封信,而他依然堅決程式沒問題,而我依然無法看見這個選單。我到 MSDN 論壇發問一樣沒得到解答。直到剛剛才被我研究出一個 Workaround 的方法。

如下圖是我在安裝 TortoiseSVN 後在 Windows Server 2008 測試的畫面,透過點選滑鼠右鍵拖曳 Subversion 工作目錄時,並不會出現任何 TortoiseSVN 的選單。

我在安裝 TortoiseSVN 後在 Windows Server 2008 測試的畫面,透過點選滑鼠右鍵拖曳 Subversion 工作目錄時,並不會出現任何 TortoiseSVN 的選單

我還特別用 ShellExView ( Shell Extensions Manager ) 查看過所有 TortoiseSVN 的註冊機碼,也跟作者討論過,基本上所有機碼都是正確設定的。

今天又再度花時間盲測這個問題 ( 我大概有測10 次以上了),結果盡然被我發現了解決之道,便欣喜若狂的快寫文章分享一下,我想應該有不少人跟我有相同的困擾,畢竟 TortoiseSVN 是我們每天都要用的工具,當遇到問題時真的會跳腳。

解決方法如下

開啟 TortoiseSVN 的 Settings 設定畫面,選取左側的 Icon Overlays 頁籤,並且明確將 Show overlays and context menu only in explorer 給取消勾選,按下確定鍵後,問題自然就迎刃而解。

開啟 TortoiseSVN 的 Settings 設定畫面,選取左側的 Icon Overlays 頁籤,並且明確將 Show overlays and context menu only in explorer 給取消勾選,按下確定鍵後,問題自然就迎刃而解

設定完成後,立即測試就看的到效果了!

TortoiseSVN 的滑鼠右鍵拖曳選單

相關連結

  

此文章由 will 發表於 2009/6/14 下午 07:16:06

永久連結 | 評論 (0) | 此文章的RSSRSS comment feed |

分類: Subversion

標籤: , ,

收藏: