2010-07-14 129 views
1

我有點不清楚在SVN合併分支,並想知道如果有人能解釋...的svn:合併分支

project1 
    trunk 
     foo.c 
     bar.c 
     baz.c 
    branches 
    tags 
project2 
    trunk 
     foo.c 
     quux.c 
     boing.c 
    branches 
     project1-offshoot 
     foo.c 
     bar.c 
     baz.c 
     boing.c 
    tags 

假設我們有以下的情況。在我們的svn倉庫中有一個「project1」。 Bob開始一個新項目「project2」並開始在主幹下工作。然後查理說:「等一下!這就像project1!」所以他告訴Bob他將爲project2創建一個名爲「project1-offshoot」的分支(project1/trunk中的svn copy),並對其進行適當修改以準備與project2進行合併。

Bob和Charlie將project2/branches/project1-branchshoot合併到project2/trunk中的相應操作是什麼?

文件「foo.c」和「boing.c」每個文件都有兩個獨立的歷史記錄(foo來自project1/trunk-> project2/branches/project1-offshoot以及來自project2/trunk;來自project2/trunk並從project2/branches/project1-branchshoot)。 SVN中的文件是否有兩個祖先?或者你是否被迫選擇一個作爲祖先,然後從另一個文件中進行文本合併而不保留任何指向該文件源的鏈接?

回答

3

您可能需要將merge命令與--ignore-ancestry選項一起使用,因爲源文件具有獨立的歷史記錄且沒有共享的祖先。

從版本控制使用Subversion(Subversion版本1.5),由本·柯林斯 - 蘇斯曼,布萊恩·W·Fitpatrick和C.邁克爾Pilato:

「大部分合並涉及到比較樹木 被祖先有關一個 另一個;因此,svn合併默認 此行爲。有時, 但是,您可能需要合併 命令來比較兩個不相關的 樹。

「如果你問 SVN合併的兩棵樹比較, 你會看到整個第一棵樹是 刪除,隨後 整個第二樹的補充!在這種情況下 ,你會想SVN合併 做一個基於路徑的比較而已, 忽略文件 和目錄之間的任何關係。在 --ignore-ancestry選項添加到您的合併命令,它會表現就像 SVN差異。(相反, - 注意 - 血統選項將導致svn diff的行爲像svn合併 命令。)「

如果我正確理解你的第二個問題(即, 「SVN中的文件是否有兩個祖先?」)答案是否定的。您必須將project1中的更改​​合併到項目2中,反之亦然。

只需注意:通常項目的分支文件夾是爲特定項目樹幹的分支保留的,這意味着只有project1樹幹的分支進入project1的分支文件夾。當然,沒有什麼能夠阻止任何人做出不同的事情,但它確實讓事情變得更加美好和乾淨。