2011-04-15 54 views
2

目前我正在嘗試使用相同的代碼設置多個產品的存儲庫。最好的解決方案是製作共享代碼的實際庫並以這種方式使用它們。然而,目前這需要很多時間。我們的想法是具有與下面的樹SVN與外部通用代碼

-trunk-Project1 
     -Project2 
     -Shared 

項目1和2兩者都具有外部以包括共享代碼的單個庫。指向特定修訂的外部指向不會影響project1和共享代碼上的project2構建。由此出現問題。

當對共享代碼進行更改並執行提交(使用toolto SVN)時,項目1和共享代碼都會獲取更改,並很好地將SVN作爲單個修訂版本提交。但是,當我或同事進行更新時,項目不會生成,因爲svn外部指向「舊」版本。

這可以通過更新外部並提交它(將構建中斷)來修復。我們可以臨時從外部刪除特定修訂版,但是在開發結束時我們必須再次添加它。有沒有辦法自動做到這一點?

回答

2

我想你有幾個選擇。首先是按照Martin的建議,使用帶有分支的單個模塊。您將爲每個活動項目或開發線程分支。當您合併回中繼線時,共享代碼的更改將被選中。

例如

Module 
    | 
    + trunk 
    | + Project1 
    | + Project2 
    | + Shared 
    | 
    + branches 
     | 
     + Project1Development 
     | + Project1 [active development here] 
     | + Project2 
     | + Shared [active development here] 
     | 
     + Project2Development 
      + Project1 
      + Project2 [active development here] 
      + Shared [active development here] 

其次,您可以分支共享,以便您不需要將外部固定到它。這是你的版本庫中的內容

Project1 
    | 
    + trunk [svn:external to a branch of Shared] 

Project2 
    | 
    + trunk [svn:external to a branch of Shared] 

Shared 
    | 
    + trunk 
    | 
    + branches 
     | 
     + Project1Development 
     | 
     + Project2Development 

每個項目都會使用自己的中繼視圖。這裏的危險是分支太長 - 你需要遵守規則來合併和刪除它們,也許在每次發佈之後。只有在需要項目特定的共享更改時才應創建Shared的分支。

第三,您繼續像現在一樣使用外部設備,並承擔固定修訂的痛苦。如果你這樣做的話,我會重新安排你的回購,就像上面的第二個數字 - 你在項目中使用外部項目時會有一些氣味。

+0

第二個建議基本上是用一個分支替換修訂號,給予額外的靈活性。正如所指出的那樣,需要更多的管理才能保持最新,但我相信這是代碼共享所固有的。儘管有一個真正獨立的庫,但你有許多相同的問題,但分佈在兩個庫中。外部只用於防止構建過程中的額外工作。 – refro 2011-04-15 11:27:46

1

如果您有多個存儲庫,並且需要混合所有存儲庫中的源以構建項目,則應該使用svn:external。基於你的問題,我會說你只有1個倉庫,因此不需要svn:external。

您可以使用分支機構。 Project1和Project2都更改爲在其自己的分支中共享。您必須制定出色的工作協議才能儘可能經常地將更改集成到主幹(較小的差異更容易合併),並確保主幹上的構建永不中斷。

我可以推薦Henrik Kniberg's paper on Version Control,它很好地涵蓋了這個主題。

+0

我已閱讀論文,謝謝指出。它很好地描述了分支發佈和同步開發的策略。但是我沒有看到它提到了多個項目和它們之間的共享代碼,或者我錯過了一些東西。 – refro 2011-04-15 11:22:48

+0

實際上,共享*一些*代碼(如您的情況)或兩個共享整個代碼庫的團隊之間幾乎沒有什麼區別。我認爲關於「多個團隊 - 如果其他團隊也發佈到主幹上呢?」這一段落?可以適用於你的情況。 – 2011-04-15 12:16:02

0

您的問題是Project1和Project 2需要特定版本的共享。所以你需要在你的佈局中明確表達。

例如,你可以這樣做:

-trunk - 項目1 - Project1Share - 項目2 - Project2Share - 共享

而且具有Project1Share和Project2Share爲版本的外部指向特定Shared的修訂版本,以及「Shared」是該共享庫代碼的最新版本。

共享模塊當然可以在不同的回購協議中。

由於您的子項目依賴於共享代碼的特定修訂,因此您無法避免管理針對您的子項目構建的特定版本:因此您需要明確說明。

如果規則是Project1總是針對最新版本的shared和build2針對特定版本進行構建,那麼project1shared外部版本可以未版本化並且project2版本化。

0

到目前爲止所有的好答案 - 但還有另一種選擇:使用標籤。 開發完成後,您想要將外部鏈接重新鏈接到P1和P2都指向新的共享項目。在此之前,您希望P1和P2指向Shared的舊版已知工作版本。

因此,繼續在外部指向HEAD共享修訂版的主幹上工作。當你完成時,將整個分支分支到一個標籤目錄(例如稱爲ReleaseX),它將包含所有這些版本的工作代碼。那麼你可以繼續在主幹上工作,而不用擔心你打破了你發佈的'完成'版本。

如果您在不同的時間發佈P1和P2,仍然可以使用這種方法 - 將項目放入標籤分支時,將其外部設置爲當前版本的共享項目。當下一個項目被標記(並且共享項目得到更新)時,舊項目仍將指向正確版本的Shared,直到其下一個版本被標記爲止,等等。