當你在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想要的方式)或找到一份新工作。
即使在那之後,項目負責人一直告訴我目錄佈局是多麼的錯誤,如果項目中的其他人都簡單地遵循他的邏輯和改進的目錄佈局,一切都會好起來的。
這個問題看起來差不多:http://stackoverflow.com/q/1496884/1023562 – 2015-03-02 12:24:27
查看[Cherrypicking]上的SVN文檔(http://svnbook.red-bean.com/en/1.8 /svn.branchmerge.advanced.html#svn.branchmerge.cherrypicking) – AlG 2015-03-02 12:26:18