Linux命令行操作SVN合並


環境

Centos 7

SVN 1.7

若需要部署SVN服務端,可以參考Centos7配置SVN服務端

將一個oa項目作為示例:

Shell> svn ls svn://localhost/oa
  branches/
  tags/
  trunk/
# 假設當前trunk剛剛發版,版本號是1.0,所以要打個1.0的tag,並創建一個修復bug的分支
Shell> svn cp svn://localhost/oa/trunk svn://localhost/oa/tags/1.0 -m '1.0 tag'
Shell> svn cp svn://localhost/oa/trunk svn://localhost/oa/branches/1.0-bug -m '1.0 bug branch'
Shell> svn co svn://localhost/oa  # 導出代碼到本地,方便后文演示

概述

命令行合並的命令是 svn merge ... ,有一個參數 --dry-run ,任何合並都可用,作用是只模擬合並而不是真正合並,每次合並前先模擬一次是個好習慣。

合並有如下四種模式(注:下文都是以從主干創建了分支作為前提進行描述):

sync merge 同步合並;創建分支后修改了主干,需要將主干的修改同步到分支時使用
cherry-pick merge 選擇合並;將指定的某一次或多次修改合並到目標
reintegrate merge 重聚合並;分支任務完成,需要將分支的修改合並到主干時使用,完成后刪除分支(很多翻譯為復興,我覺得重聚好一點,分支使命完成並與自己的源頭重新聚合到一起)
2-URL merge 合並兩棵不同的樹;對比兩個url的不同,然后將不同合並到指定目標,這三者可以是完全不同的樹,可以沒有任何關系

合並的操作中經常需要查看修訂版本號,常用的方法有:

Shell> svn log               # 查看所有提交記錄
Shell> svn log -l 10          # 查看最近10條記錄
Shell> svn log --stop-on-copy     # 查看分支創建以來的記錄
Shell> svn log | grep <關鍵字> -C 5  # 輸出內容中查找關鍵字,打印匹配行的前后5行內容

同步合並

用法:svn merge SOURCE[@REV] [TARGET_WCPATH]

在1.0-bug分支開發了一段時間后,由於某個原因trunk進行了一次或多次修改,現在需要將trunk的修改同步到分支,並且不能影響分支上已提交的bug修復,命令如下:

Shell> svn merge svn://localhost/oa/trunk oa/branches/1.0-bug/
Shell> svn ci oa/branches/1.0-bug/ -m '同步合並'

source后可接修訂版本號(默認是HEAD),表示同步到指定位置,假設trunk進行了兩次修改,版本號分別是r9、r10,那么:

Shell> svn merge svn://localhost/oa/trunk@r9 oa/branches/1.0-bug/  # 只同步到r9,r10的修改不會同步到分支

選擇合並

用法:svn merge [-c M[,N...] | -r N:M ...] SOURCE[@REV] [TARGET_WCPATH]

在標記了tag后,由於某個原因trunk進行了一次或多次修改,現在需要將trunk的某些必要的修改更新到tag,命令如下:

Shell> svn merge -c r10 svn://localhost/oa/trunk oa/tags/1.0/  # -c 指定版本號,將r10的修改進行合並
Shell> svn merge -c r9,r10 svn://localhost/oa/trunk oa/tags/1.0/  # 可以逗號分隔多個版本號,將r9和r10的修改進行合並
Shell> svn merge -r r9:r10 svn://localhost/oa/trunk oa/tags/1.0/  # -r 指定范圍版本號,將r9到r10的修改進行合並,注意這個范圍不包含r9本身的修改,這個 -r r9:r10 相當於 -c r10
Shell> svn merge -c r6 -r r9:r10 svn://localhost/oa/trunk oa/tags/1.0/  # -c -r 可以一起使用
Shell> svn ci oa/tags/1.0/ -m '選擇合並'

重聚合並

用法:svn merge --reintegrate SOURCE[@REV] [TARGET_WCPATH]

當分支完成了自己的使命,不需要再保留時,需要將分支合並回trunk,此時就需要重聚合並;合並后就可以刪除分支,若后續再有需求則應重建分支。

這種情況常見於功能性分支,功能開發完成即執行重聚合並,用於bug分支時表明結束對該版本的技術支持,后續不再修復bug了。

重聚合並前,為了減少可能的沖突,應該讓trunk與分支處於同步狀態,若創建分支后trunk進行過修改且未進行同步(或者說是有未同步的更新)則先進行一次同步合並,然后再重聚:

Shell> svn merge --reintegrate svn://localhost/oa/branches/1.0-bug oa/trunk/
Shell> svn ci oa/trunk/ -m '重聚合並'

source后可接修訂版本號(默認是HEAD),表示合並截止到指定位置,但重聚肯定是要把分支所有修改合並,所以非常特殊的情況下才會需要指定REV。

合並兩棵不同的樹

用法:svn merge SOURCE1[@N] SOURCE2[@M] [TARGET_WCPATH]

source1、source2、target三者可以是完全沒關系的三個地址,所以這是最靈活的合並,其他合並能做的它都能做,不能做的它也能做(懷疑其他合並就是根據常用場景封裝了這個合並吧?)。

靈活就意味着容易出錯,所以還是建議優先用其他合並,若那些都無法滿足要求再使用該合並方式。

比如,想把一個分支branch1相比於trunk的區別更新到另一個從trunk不同版本號創建的分支branche2,則命令如下:

Shell> svn merge svn://localhost/oa/trunk svn://localhost/oa/branches/1.0-branch1 oa/branches/1.0-branch2/
Shell> ci oa/branches/1.0-branch2/ -m '合並兩棵不同的樹'

source1、source2后面可接版本號(默認是HEAD),表示使用指定的版本進行對比。

 

over


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM