2011-10-27 34 views
0

我們有幾個Zend_Framework應用程序,我們希望保留在單獨的Subversion存儲庫中。但是,這些應用程序共享相同的數據庫抽象層以及幾個相同的通用組件。如何設置相關的顛覆外部?應該嗎?

我們希望以某種方式分享應用程序之間的通用位。我們目前的想法看起來像

svn://foo/itg-common/trunk 
svn://foo/itg-common/branches/foo 
svn://foo/itg-common/branches/production 

svn://foo/itg-app/trunk 
svn://foo/itg-app/branches/foo 
svn://foo/itg-app/branches/production 

現在,我們想了ITG-應用程序庫有一個的外部參考ITG-公共存儲庫。問題是我們想要itg-app/trunk/common要鏈接到itg-common/trunk,itg-app/branches/foo/common要鏈接到itg-common/branches/foo等。也就是說,一般模式是itg-app/$BRANCH/common -> itg-common/$BRANCH

現在,原則上我們可以創建這些外部結構,但是每當我們嘗試合併時都會出現問題。例如。從$/trunk合併到$/branches/production會覆蓋svn:externals屬性,使$/branches/production/common指向itg-common/trunk

這是否有意義?如果是這樣,是否有解決這個問題的方法?如果沒有,爲什麼不,我們應該怎麼做呢?

回答

3

這是否有意義?如果是這樣,是否有解決這個問題的方法?如果沒有,爲什麼不,我們應該怎麼做呢?

由於prodigitalson said已經在SVN外部基本上被認爲是一個完全不同的軟件,有自己的發佈週期,分支,標籤等。根據這個模型,你不應該取消固定的外部進一些樹幹完全可以,但將它們全部固定到標籤或修訂版。這是一個使用外部源代碼的非常有限的模型,但這正是SVN所支持的。離開這裏,你是獨立的。 (關於我個人的戰爭故事,請參閱下面的內容。)

如果我是你,我會重新考慮的另一件事是指另一個存儲庫。輸入相對於當前項目或存儲庫根目錄的IME比使用絕對路徑要好得多。只要考慮你可能會將協議從svn:更改爲https:。 (我曾看到過這種情況發生在一家公司,儘管很大程度上依靠腳本來改變所有的外部設備,但這種轉變讓每個人都陷入了噩夢般的困境。)外部相對路徑更加健壯,但它們只能在一個存儲庫。


我工作的公司剛剛面臨類似的問題。我們有很多不同產品之間共享的代碼。這是通過外部完成的,而那些外部引用的項目本身就是外部的。在某些情況下,我們可能會下降到三層遞歸外部,我們已經知道未來會有更多。所有這些代碼都在不斷努力,我們希望讓外部人蔘考他們引用的項目的主幹,因爲自動化測試會消除這種情況,並且管理所有這些遞歸外部項目的發佈將需要我們無法承擔的努力。

但是在這個設置中分支一個項目是一個真正的痛苦,因爲它不足以釘住項目的外部,當這些項目的外部參照未鎖定的外部時。當你需要分支項目foofoo',其中,通過外部,是指項目X,這又通過外部,是指項目XX,你需要的XXfoo'分支,它是在foo'分支外部X,這是foo'本身的外部。想象一下foo中有六個外部項目,其中一半有自己的外部項目,一些是遞歸三層甚至更多的層次,並且您到達項目XXX時散佈着爲其項目創建的分支,但它不應該知道。

我們的解決方案是遞歸要麼A)與同時通過<project>/branches/foo'引用他們在foo/branches/externals/foo'/X簡稱或B)設置的外部X分支什麼分支取代所有的外部(與foo/branches/externals/foo'/X本身指的是foo/branches/externals/foo'/XX) 。但是,在創建foo'時進行設置不可能非常複雜,並且提供了創造愚蠢錯誤的足夠機會,因此我們使用腳本來遞歸地下降項目及其外部並執行所有這些操作。

1

您應該只在應用程序的單個回購站外部。我會假設這將是您的常見回購中的「生產」分支。基本上,您將外部視爲自己獨立的項目,並將其視爲自己的開發生命週期。