2009-08-15 61 views
9

所以,我已經熟悉了這一點:
http://svnbook.red-bean.com/en/1.5/svn.advanced.vendorbr.html在SVN中處理供應商分支機構的最佳方式是什麼?

我的問題是你如何處理同時具有穩定的釋放,要整合的α/β分支廠商分支?

因此,假設您遵循SVN書中的原始示例。你必須:

的svn://本地主機的/ home/SVN /供應商/ libcomplex的/電流
的svn://localhost/home/svn/vendor/libcomplex/1.0
的svn://本地主機/家/svn/vendor/libcomplex/1.1(同電流)現在

,說你有你自己的「計算」的應用程序的兩個版本:

計算(這基本上是主幹==鈣2.0)
計算-1.0(向公衆公開)

假設calc-1.0使用libcomplex 1.0和calc(在trunk中)使用了libcomplex 1.1,它仍在開發中。

libcomplex 1.0中存在一個錯誤,並且發佈了一個新版本來修復該錯誤:libcomplex 1.0.1。 libcomplex維護者也將這個bug修復包含在libcomplex 1.1中。

您尚未準備好發佈calc 2.0,因此您需要將libcomplex 1.0.1集成到您的供應商分支中,然後更新calc-1.0以製作bug修復版本。

它去哪兒了?

你不能把它放在svn:// localhost/home/svn/vendor/libcomplex/current中,因爲1.1當前位於那裏。

您是否將svn://localhost/home/svn/vendor/libcomplex/1.0複製到svn://localhost/home/svn/vendor/libcomplex/1.0.1,然後引入新版本?這樣你可以使用svn將1.0和1.0.1之間的差異合併到calc-1.0中。

回答

3

建議的做法是爲您的版本創建一個分支。這樣,無論您在供應商文件夾的主幹中做了哪些更改都無關緊要。然後,您可以使用libcomplex的1.0.1版本更新1.0版本分支,並且不會影響trunk(calc 2.0)。

但是,如果calc1.0和calc2.0同時存在於同一分支中,這將不起作用。

接下來要做的事就是不要有「當前」。只需直接參考您使用的版本即可。例如,將文件夾結構保留爲:

vendor/libcomplex/1.0 
vendor/libcomplex/1.1 
vendor/libcomplex/1.0.1 

並且從不覆蓋這些文件。然後calc 2.0可以引用libcomplex的1.1版本,而calc 1.0可以引用1.0.1。

您的最後一個選項(並非真正推薦)是使用svn標籤(請參閱complex tags)。它們允許您混合搭配版本,所以您可以在技術上創建一個標籤,以代表舊版libcomplex的Calc 1.0修補程序版本。

+0

在我之前的例子中,我的發行版有一個分支:calc 1.0。供應商文件夾不包含在calc下。你是否建議/供應商也分支?需要明確的是這裏是我描述例如: /供應商/ libcomplex的/ /鈣/中繼/ /鈣/支鏈/ 1。0/ 你的建議是不使用「當前」,只使用文件夾結構將不能適當地將版本之間的變化合併到主幹中,從而破壞目的。您需要此更改歷史記錄才能將更改合併到您修改原始供應商源的主幹中。 – 2009-08-18 16:55:49

+0

我的方法是當你所做的所有工作都使用發佈的版本時。 如果您還在修改源代碼,那麼將供應商代碼視爲您自己的代碼(即將其包含在您的幹線分支中而不是將供應商作爲單獨的文件夾)可能會很有用。 但是你的方法也是有意義的。創建vendor/libcomplex/1.0.1分支,合併任何自定義,並將calc 1.0版本更新爲指向vendor/libcomplex/1.0.1,然後發佈calc 1.0.1。只要libcomplex 1.1準備就緒,合併定製,構建calc2.0,就可以開始了。 Trunk從不指向1.0.1 – 2009-08-19 01:13:38

2

供應商分支背後的想法似乎是他們應該反映供應商自己的倉庫可能的樣子。因此,current代表供應商的中繼線,標籤版本代表每個版本發佈時創建的供應商自己的標籤。

鑑於此,問題的答案變得相當清楚。爲了發佈1.0,1.1和1.0.1,供應商大概有一個針對1.0.x bugfixed版本的分支,同時繼續在其主幹上的1.1及更高版本上工作。我們的供應商分支應該反映這個設置

也就是說,我們還需要一個分支(在我們的供應商分支中)用於1.0.x bugfixed版本。這應該從包含1.0時的當前時間創建,並且可以命名爲current-1.0.x。然後可以將該分支更新爲1.0.1,然後像往常一樣將其標記並複製到我們自己的樹中。

2

我喜歡這個工作,與外部庫:

project/myProject/{branches,trunk} 
vendor/libcomplex/1.0 
vendor/libcomplex/1.0.1 
vendor/libcomplex/2.0.0 
mypatched-vendor/libcomplex/1.0 
mypatched-vendor/libcomplex/1.0.1 
mypatched-vendor/libcomplex/2.0.0 

vendor/<lib>/<version>進口和mypatched廠商開始與svn cp vendor/<lib>/<version> mypatched-vendor/<lib>/<version>後,從來沒有改變過。

現在區別vendor/libcomplex/1.0 mypatched-vendor/libcomplex/1.0應該爲您提供補丁以合併到剛輸入的1.0.1版本。

我可能在少數,但我喜歡svn:externals屬性。很多IDE不喜歡它們,因此謹慎使用。原因是這樣的。我現在可以編輯我的主項目:

checkout project/myProject/trunk to myprj-trunk你退房運行。

svn propedit svn:externals . 
# with 
libcomplex URLTO/mypatched-vendor/libcomplex/1.0 

當我想測試一個新的lib版本時,我只需將該屬性編輯到另一個地方並運行update。這也具有這樣的效果,即使我已經更改WC上的某些文件,我也不會意外地將任何東西提交到libcomplex樹的一部分。我必須在該目錄下或專門在那裏進行修改。

現在升級,修復,我的項目的分支方便的移動到新的libcomplex版本,沒有比最初合併到mypathed廠商更多。我所有的項目分支都只需要進行交換和測試。另外,爲我的項目獲得庫依賴關係相對容易。

有關的外部最後的好處是,開始一個新項目和上游時,也嚴重開發,使用SVN可以參考的上游外部,如果你不需要打補丁庫。當上遊傷了你的項目,你可以保持上游版本與-rNUM選項,如一陣:

libcomplex -r21 UPSTREAMURLTO/mypatched-vendor/libcomplex/trunk 

一個明確的缺點的svn:externals的是,外部組件URL必須與所有結賬相同的URI訪問您項目的變體。

但使用外部允許您保持供應商回購獨立於您的項目回購。

相關問題