2012-09-03 130 views
4

假設我們有一個trunk和一個分支(COKE)。 (我用git了SVN和trunk合併COKE用SVN,不是GIT)SVN從主幹分支結果合併樹衝突

  1. 已經有,我們要在COKE分支變化FILE1 on trunk
  2. 我們從trunk合併,我承諾在COKE branch合併。
  3. 然後FILE1trunk刪除了,我想在COKE這種變化。
  4. 我合併和FILE1COKE branch發生樹衝突。

由於(2)中的合併提交,是否會發生此樹衝突?

我能做些什麼來解決這三個衝突?

svn resolve --accept theirs-full /path/FILE1不工作,只說「工作」是去工作。

回答

2

應該有在這種情況下沒有樹衝突,除非某些合併跟蹤信息丟失。

爲了檢驗這一點,運行以下命令:

$ svn switch ^/branches/COKE 
$ svn mergeinfo --show-revs=merged ^/trunk 

這將打印的修正列表從主幹合併到焦炭分公司。當你在主幹處修改FILE1時,你能找到修訂嗎?很可能沒有那個版本。

這是SVN用戶將修改從一個分支合併到另一個分支,但不提交整個工作副本(即包括根目錄)而不是提交合並修改的文件的常見情況。

錯誤:

$ svn merge ^/trunk 
--- Merging r5 through r6 into '.': 
M file.txt 
--- Recording mergeinfo for merge of r5 through r6 into '.': 
U . 
$ svn commit FILE1 

的問題是根目錄存儲的svn:mergeinfo屬性。 Subversion使用這個屬性來跟蹤合併,所以你必須提交整個工作副本。

右:

$ svn merge ^/trunk 
--- Merging r5 through r6 into '.': 
M file.txt 
--- Recording mergeinfo for merge of r5 through r6 into '.': 
U . 
$ svn commit . 

當你試圖主幹合併到焦炭分公司第二次,顛覆檢測FILE1在軀幹和它在焦炭分支修改的同一時間(已刪除第2步)。結果它用樹衝突標記了文件(本地編輯,合併後的傳入刪除)。

如何解決這個問題?

現在,您必須修復分支COKE的合併跟蹤信息。爲了做到這一點重複步驟2 --record,唯一的選擇,指定適當的修訂:

$ svn merge --record-only -cN ^/trunk 
--- Recording mergeinfo for merge of r5 through r6 into '.': 
U . 
$ svn commit . 

其中N是FILE1的軀幹你試圖合併修改。

+0

這是一個偉大的回答,很有啓發!感謝您的信息! –

1

vadishev的回答爲我提供了創建此腳本的知識,該腳本應自動爲您添加缺少的合併信息。

確保PWD是枝根,然後運行這個:

trun="path/to/trunk/root" 
for i in `svn mergeinfo --show-revs=merged $trun | sed 's/^r//g'` 
do 
    echo "working on $i" 
    svn merge --record-only -c$i $trun 
done 

,或作爲oneliner:

trun="../../trunk/tetracosm"; for i in `svn mergeinfo --show-revs=merged $trun | sed 's/^r//g'`; do echo "working on $i"; svn merge --record-only -c$i $trun; done