2012-03-13 23 views
1

我試圖替換我的svn合併工作流程 - 通常是svn diff,有時是一些手動編輯修補程序,然後patch - 與實際svn merge。但是我看到了一些意想不到的行爲,並且我無法在任何SVN文檔中找到任何解釋。這裏是我的情況:(REV 0)爲什麼svn合併--ignore-ancestry在這種情況下工作了兩次,當svn diff + patch的時候呢?

  1. 新庫
  2. 創建了一個名爲樹幹file(REV 1)
  3. 複製樹幹到樹枝/ BRANCH1的一個空白文件
  4. (REV 2)。在分支機構/ BRANCH1,改變file讀 「ABCDEFG」,並承諾
  5. 早在軀幹,跑了(轉3):

svn merge -c3 ^/branches/branch1 . --ignore-ancestry

到目前爲止,這麼好。在trunk中的file包含「abcdefg」。因爲我使用了--ignore-ancestry,所以trunk沒有更新任何mergeinfo。爲了驗證,我跑:

svn pg svn:mergeinfo .

打印出什麼。大。所以現在我想再次應用r3 中的更改。所以,我跑:

svn merge -c3 ^/branches/branch1 . --ignore-ancestry

此命令執行什麼。打印出沒有輸出,不會更改file,並且不會添加任何合併信息。如果我做同樣的事情與我的老DIFF和補丁的工作流程,如:

svn diff -c3 ^/branches/branch1 | patch

然後文件與變化再次更新。而且,由於改變總額僅有:

--- file (revision 2) 
    +++ file (revision 3) 
    @@ -0,0 +1 @@ 
    +abcdefg 

再次應用,它只是使file包含「ABCDEFG」兩行,按預期。

~~~

我知道這不應該是一個共同的工作流程,但我覺得我需要了解svn merge實際上是在做這樣的情況之前,我可以輕鬆地採用它。 (不需要支持svn merge的好處 - 我已經登機了。)

謝謝!

+0

我想也許這與diff3和diff之間的差異有關,但即使使用diff3,我也無法得到與使用svn merge相同的結果。是什麼賦予了? – mhjacobson 2012-03-20 09:41:38

回答

1

合併是通過比較兩個文件合併,並迫使你調和的差異(使用祖先時,它很容易,當然很多時候文件有關)。如果文件完全相同,則什麼都不會發生看來Subversion認爲繼承者會贏得「舊文件」和「後繼文件」之間的衝突。對於沒有繼承的任何真實內容,您將遇到衝突以使用合併工具進行修復。 --ignore-ancestry可能確實忽略svn:mergeinfo屬性,同時保持基於隱式路徑的歷史信息,當它幫助平凡時,文檔在該點上不明確。

另一方面,你的補丁工作流程是流動的,這就是爲什麼它會增加文本內容的兩倍:在沒有上下文的情況下(雖然上下文希望統一補丁格式,實際上沒有在你的情況下),修補程序認爲再次應用該修補程序是一個好主意,儘管在這種情況下正確的方法通常是SubVersion的方法。另一個補丁工具可能已經注意到沒有上下文,並認爲這是必須執行的「文件開始」/「文件結束」上下文,補丁將失敗。

相關問題