2009-04-16 18 views
11

我們在我們的主要SVN項目根目錄中有幾個大的子項目。
我在使用我們的發佈分支時只提交併合併我的子項目,主要是因爲它更快。提交併合併在被認爲有害的SVN子目錄上?

然而,同事指出此reference to merging subdirectories in Version Control with Subversion(又名「SVN書」):

不幸的是,這是警告的程度。鏈接部分也沒有給出解釋。

提交和合並SVN子目錄對釋放分支有害嗎?
短期特徵分支怎麼樣?

+0

我喜歡標題:) – Dunaril 2011-03-31 06:34:03

回答

14

一個可能的解釋是,你可能會忘記更改集的一部分。

如果更改設置爲合併您檢出的子目錄之外的封面文件,那麼總是有可能忘記合併這些文件。

例如,如果你有一個犯這樣的主幹:

r5 | rich | 2009-04-16 22:22:46 +0200 (Thu, 16 Apr 2009) | 2 lines 
Changed paths: 
    M /trunk/subdir1/main.c 
    M /trunk/subdir2/main.c 

Change some stuff 

然後,你還要subdir1的檢出從您的分支「穩定」,那麼你可以合併設置R5這樣的變化:

$ svn co http://example.com/svn/branches/stable/subdir1 
$ cd subdir1 
$ svn merge -c 5 http://example.com/svn/trunk/subdir1 . 
--- Merging r5 into '.': 
U main.c 
$ svn ci -m"Merged r5 from trunk" 

但這隻會合並修訂5.更糟糕的一半是,如果你回去看看日誌,它現在將顯示此:

$ svn log -g http://example.com/svn/ 
... 
------------------------------------------------------------------------ 
r5 | rich | 2009-04-16 22:22:46 +0200 (Thu, 16 Apr 2009) | 2 lines 
Changed paths: 
    M /trunk/subdir1/main.c 
    M /trunk/subdir2/main.c 
Merged via: r6 

Change some stuff 

所以它看起來像你合併了整個提交,實際上你只合並了一部分。當然,r6確實表明穩定分支上只有1個文件發生了變化。

------------------------------------------------------------------------ 
r6 | rich | 2009-04-16 22:28:16 +0200 (Thu, 16 Apr 2009) | 1 line 
Changed paths: 
    M /branches/stable/subdir2 
    M /branches/stable/subdir2/main.c 

Merge revision 5 from trunk 

有人要記住,或通知,將變更集只有部分得到了合併,剩下需要做。不使用子目錄合併避免了這個問題。

有些時候你真的不想合併所有的前一個提交,而上面的場景正是你想要做的。在這種情況下,最好添加一個描述你意圖的好提交信息。

+1

+1 - 很好的回答和例子 – 2009-04-16 20:38:17

1

提交不應該有問題,但在合併SVN跟蹤什麼是和不合並。

因此,我假設你想在根上合併以簡化未來的合併(就SVN比較的數據集大小而言)。

1

對於1.5之前的Subversion版本,合併子目錄以後再合併目錄樹的其餘部分非常複雜。 如果您合併了一個目錄,svn只需將該目錄中所做的所有更改應用到另一個分支。如果您已經合併了一個子目錄,然後嘗試合併主目錄,則子目錄中的所有更改都已存在於目標分支中(因爲您之前已將其合併)。 Svn現在不知道這些更改是來自以前的合併,它只是看到當它試圖合併子目錄時出現了「途中」,導致很多衝突。

爲了避免這種情況,您不得不小心合併之前未合併過的目錄,從而使整個過程變得更加複雜。您必須記住您已經合併了哪些子目錄的修訂版本,並且只應用其餘目錄/修訂版的其餘修改。這可能會讓人困惑。總是合併整個分支使得這更容易。當前版本的Subversion會在內部跟蹤以前的合併,因此可以避免這些問題。

提交子目錄是沒有問題的。對於svn,這只是一個正常的全局版本庫。在該版本中,只有一個子目錄中的更改,但對於svn,它仍然是整個存儲庫的新版本,就像任何其他提交一樣。

+2

在svn 1.5+中,實際上並非如此。合併子目錄,然後合併來自根的相同提交的其餘部分不會「重新合併」導致衝突的子目錄中已合併的內容。 svn:mergeinfo屬性可以防止發生這種情況。 – richq 2009-04-16 20:49:48

+0

很高興聽到這個消息。它確實使顛覆活動不必要地和煩人地合併到無用的地步。 – sth 2009-04-16 21:40:55

5

這樣做的另一個原因可能是僅合併到根限制了要在存儲庫中的文件夾/文件上設置的svn:mergeinfo屬性的數量。