2015-03-02 61 views
2

我正在嘗試將一個提交與版本1000(影響六個Java文件)從主幹合併到一個分支。執行下面的命令顯示效果完全一樣:在SVN合併後忽略svn:mergeinfo中的更改是否安全?

svn merge -c1000 https://<my-project>/trunk 
svn merge -r999:1000 https://<my-project>/trunk 

這不僅導致預期的6個Java文件改變,但其他幾十個文件和目錄(但在條件不一切)。爲什麼會發生?當什麼在我的預期完全沒有更改的文件究竟改變了看,它總是看起來是這樣的:

> svn diff SomeOtherFile.java 

Property changes on: SomeOtherFile.java 
___________________________________________________________________ 
Modified: svn:mergeinfo 
    Merged SomeOtherFile.java:r1000 

是不是好恢復所有的改變svn:mergeinfo文件和目錄,只承諾正是這六個的Java我原本以爲合併的文件?後果是什麼?

+1

這個問題看起來差不多:http://stackoverflow.com/q/1496884/1023562 – 2015-03-02 12:24:27

+0

查看[Cherrypicking]上的SVN文檔(http://svnbook.red-bean.com/en/1.8 /svn.branchmerge.advanced.html#svn.branchmerge.cherrypicking) – AlG 2015-03-02 12:26:18

回答

4

當你在Subversion中進行合併時,你應該幾乎總是合併到項目的基礎上。即使您正在合併的文件的目標深藏在目錄層次結構中,也是如此。

Subversion使用屬性(特別是svn:mergeinfo屬性)來跟蹤合併。該屬性被添加到合併發生的基地。如果僅從項目的根目錄合併,則只有項目根目錄具有此屬性。如果您將所有地方合併,您將在整個項目中散佈svn:mergeinfo個物業。任何時候發生合併,並且在該目錄層次結構中的某處有一個svn:mergeinfo屬性,該屬性必須更新。

即使它們所在的目錄未被更改,也不要忽略這些屬性。在子目錄中可能有一個文件取決於那個svn:mergeinfo

將Subversion版本考慮爲變更集。也就是說,單個修訂版可能會影響多個文件。合併也是如此。比方說,你的項目是這樣的:

foo 
    src 
    test 
     ... 
    main 
     resources 
      ... 
     java 
      com 
       vegicorp 
        ... 
        munge 
         frapify 
          purèe.java 

樹枝上,你有一個修訂版,其中包括要合併到主幹中purèe.java的變化。很容易進入foo/src/main/java/com/vegicorp/munge/frapify目錄並從那裏處理合並。這將在frapify目錄中創建一個svn:merginfo,該目錄將永遠伴隨着你。每當你在任何父目錄中進行合併時,你都會對該svn:mergeinfo進行更改。

而是在項目的根目錄foo目錄上進行合併。您的合併仍然只會影響purèe.java文件,但svn:mergeinfo已更改爲foo目錄中將進行所有其他合併的文件夾。因此,你不能忽略svn:mergeinfo。最好的情況是,Subversion會認爲一個特定的修訂沒有被合併,並且會與該修訂再次合併。最糟糕的是,你搞亂了合併結果,你最終會合並一倍。

有一種方法來清理這個爛攤子。遍歷層次結構中的所有svn:mergeinfo屬性,並確保項目的根在其合併信息中包含所有這些修訂。如果不是,則將這些更改合併到根目錄中。一旦您擁有包含每一次合併的根目錄svn:mergeinfo,就可以刪除分散在整個項目中的其他svn:mergeinfo

但是,如果您沒有讓開發人員在項目的根目錄中進行合併,則會在幾個月後結束相同的混亂。所以,培養開發人員很重要。

開發者是頑固的生物,堅持以自己的方式做事。我們在網站上使用了Maven,它有一個默認的目錄佈局,一個團隊堅持認爲他們更喜歡他們自己的目錄佈局。它給我們帶來了這個項目的所有問題,但是由於這個團隊的詭計造成了大規模的部署失敗,他們被告知要麼按照其他人的方式(和Maven想要的方式)或找到一份新工作。

即使在那之後,項目負責人一直告訴我目錄佈局是多麼的錯誤,如果項目中的其他人都簡單地遵循他的邏輯和改進的目錄佈局,一切都會好起來的。

+1

非常感謝您的詳細解釋。不過,我必須指出,它是'泥',而不是'purèe'! – dokaspar 2015-03-02 23:04:05