2009-09-09 59 views
4

我們使用的是顛覆(這個問題可能適用於許多版本控制系統,但顛覆是我真正關心的。)用於分支共享庫的倉庫佈局(或掛鉤)

我們的倉庫佈局看起來像這樣:

(佈局A)

Web 
    branches 
    tags 
    trunk 
Libraries 
    Foo 
    branches 
    tags 
    trunk 
    Bar 
    branches 
    tags 
    trunk 
WindowsClient 
    branches 
    tags 
    trunk 
DB 
    branches 
    tags 
    trunk 

的問題是版本控制的單元不等於發展單元 - 我要做多次籤至 得到一個可建神器,當我科,我有分支的多個組件(和在多個地方辦理入住手續。)

這意味着,我們可以移動而不是像這樣的結構:

(佈局B )

Web 
    branches 
    tags 
    trunk 
    main 
    libs 
     Foo 
     Bar 
    DB 
WindowsClient 
    branches 
    tags 
    trunk 
    main 
    libs 
     Foo 
     Baz 
    DB 

但是,我們有任何共享庫的副本。我們可以使用svn:externals映射共享庫,但這只是一種幻覺 - 當包含項目時,它們不會被分支。

最後一個選擇是這樣的:

(佈局C)

branches 
tags 
trunk 
    Web 
    Libraries 
    Foo 
    Bar 
    WindowsClient 
    DB 

這將確保庫及其包含的項目一起支,但在那個分支的單位成本整個世界。 (這也意味着結賬的單位是整個世界,這是煩人了。)

我要的是一個倉庫佈局(佈局d),讓我:

  • 分行項目及其依賴庫一次性項目之間
  • 共享庫

這將是很好,如果我可以檢查出來的項目和它在一個結賬庫,但這是幾乎沒有的一個重要波夫。

所以,問題是:

是否有佈局d,這是什麼,以及如何使用它?

編輯:因爲它似乎沒有一個基本的佈局,這將使我這些屬性,我會在某種鉤子函數非常感興趣,讓我在那裏。如果它能與TortoiseSVN(Windows GUI)客戶端一起工作,那將是特別好,因爲這就是我們正在使用的。

+0

我知道有對倉庫佈局的許多問題。他們都沒有答案一次解決我的兩個要求。 – 2009-09-09 14:49:15

回答

1

去與選項C,然後做你簽出這樣的:

svn co -N ...../branches/mybranch workingcopy 
cd workingcopy 
svn update Web Libraries 

現在,當你運行svn業務(包括普通「svn update」),它只會處理WebLibraries目錄。

sparse directories又讀了。

+0

你得到公認ANSW呃因爲你的回答最難搞砸了。雖然我不喜歡教人們做稀疏結賬的想法,但它是唯一的(工作)答案,不會轉化爲「發佈和版本庫(帶有部分糖)」。 – 2009-09-24 16:24:08

+0

只要庫遵循與頂級產品相同的發佈週期,就可以。但是,如果這些庫是在多個頂級產品之間共享的,那麼您將需要單獨版本化的子壓力,如佈局A所示。 – gavinb 2009-09-25 10:18:53

1

對於「如何爲我的工作流佈局我的存儲庫」這個問題沒有很好的答案。因爲該軟件並不真的支持這一點。我建議使用佈局B,並分支庫代碼,並根據需要將相關的svn:external切換到該分支,或者如果分支機構需要引用該庫的非中繼版本,則立即啓用。

我打算建議Git處理這個更好,但它不是太多。由於它的子模塊引用與外部資源稍有不同的獨立資料庫,並且資料庫的每個副本都是一個「分支」,這可能稍有改進。

1

我們可以使用 SVN共享庫映射:外部組件,但是這只是一個假象 - 他們不會支 在含項目。

其實,他們將支,如果他們是在同一個存儲庫和您使用的相對外部語法,如 ^\mylib\trunk。這些外部引用被更改爲正常(複製)的文件夾。你必須明確地傳遞給 --ignore-externalssvn copy制止這種行爲,否則你會像在佈局B.副本結束 編輯:我敢肯定它的工作這種方式,但我似乎無法重現行爲。我一定是搞錯了,對不起!)

說的外部並不總是自動的分支,這一事實並不一定是一個問題。我將使用使用svn:externals(不是副本)構建的佈局B,分支項目(使用--ignore-externals),然後在分支之後使svn:externals指向正確的庫分支。

您可以設置外部指向一個特定的版本(適用於嚴格控制;您決定何時升級到lbrary的新版本)或者只是跟蹤HEAD(適用於持續集成,假設您有建立服務器)。

+0

:-(你的編輯讓我傷心。哦,也許我可以做預提交鉤子類似的東西。 – 2009-09-16 20:36:55

0

我們已經解決了,這是由幾個項目中使用共享的外部庫,共享庫雲在自己的倉庫有自己的主幹/分支/標籤的方式。

然後我們有一個生成服務器生成和發佈集成構建,里程碑和發佈和二進制假象被複制到共享位置,並存儲在特定版本的目錄(這些都是備份)。

部分的相關項目的生成腳本(通常在需求一個init /更新,而不是作爲一個標準構建的一部分運行),那麼新版本的檢查,並抓住了二進制的。這具有對相關項目之間的共享製品進行一致版本控制的優勢,並可縮短生成時間,因爲所有相關項目都可以共享相同的版本。

爲了幫助我們使用Apache Ivy,它支持瞬態依賴(即獲取依賴關係的依賴)和版本約束(例如這個項目應該只使用Foo版本1.2。*)。

+0

嗯......那將意味着我將不得不明確版本,並釋放所有我們的內部圖書館,那麼構建腳本會拉他們回來在大多數圖書館的變化將被添加用於特定項目的新功能 - 。我們的圖書館真的只存在,使之間或應用程序代碼共享 – 2009-09-09 18:14:11

+0

權,但這些都是由CI服務器上的每一個變化和建作爲快照發布;或者,對於本地開發,它們只被推送到本機的存儲庫中,有點像maven。這可以由主構建文件編寫,該構建文件依次構建每個依賴項並將構件推送到本地存儲庫只爲 – 2009-09-09 18:17:42

+0

不幸的構建,我們現在正在從持續集成很長的路要走。:-( – 2009-09-09 19:02:05

0

我建議,這是你的方法,這些庫造成你的問題。如果您開始將庫視爲單獨的項目,您可以改變它。認爲他們有自己的原因,他們自己的設計和他們自己的發佈週期,就像你可能用於單元測試,XML讀取器,數據庫訪問等的第三方庫。

當然,你會定期有時候項目中的某個功能需要庫中的新功能。實現庫功能和使用庫函數是兩個獨立的任務 - 它們可能是一項業務任務,但它們是兩項開發任務。沒有必要將兩個活動緊密聯繫在一起,因爲這是工作的方式。檢查圖書館,更改圖書館,發佈圖書館,然後簽出項目並在項目中使用圖書館的新版本。

我強烈感覺到將庫分離到自己的樹幹中是一件好事 - 當我在單個樹幹下看到多個可獨立釋放的項目時,我無法忍受它。它表現出糟糕的設計,並且被髮展中的垃圾拖入了角落。但要將它們分開,您必須能夠獨立發佈每個項目 - 對我而言,這就是具有多個項目意味着。但這不是一件難事:

首先一個項目使用外部引用特定的發佈版本的庫。這是項目引用圖書館的唯一方式。這意味着開發人員可以創建新版本的庫,而不會破壞使用它的任何項目,因爲所有項目都將引用以前的版本。當他們想要引入新版本的庫時,項目可以控制 - 開發人員可以選擇何時嘗試使用新版本測試代碼,以及何時需要修復任何構建問題,介紹。

當您明確更改某個庫的版本時,您還會在項目中獲得一個條目,其中顯示「我現在使用這個版本的庫X」,它可以讓您很好地瞭解您的歷史關於什麼時候事情正在工作,什麼時候事情發生變化的項目

當然,這在理論上都很好,但實際上開發人員有時不得不引用庫的不穩定版本和未完成版本。這很好 - 開發人員可以隨時將其工作副本切換爲指向庫中繼而不是標籤或某個開發分支,並使用此處的代碼(即使它們必須在brrr中通過該代碼工作)。交換機只是一個本地編輯,所以對提交的代碼沒有任何影響。如果項目開發是在一個不穩定的分支上,那麼你可以通過改變外部引用直到分支準備好重新集成來決定使開關更加永久,但這不是沒有明確原因通常會做的事情。

最後,分支和標記項目成爲製作主項目的分支或標記的簡單例子 - 就這些了。沒有必要擔心分支庫 - 他們會自己照顧自己。無論項目是在幹線,開發分支還是維護版本中,對庫進行更改的過程都不會發生變化。您的圖書館本身可以擁有完全獨立於主要項目的開發分支,以及多個受支持的版本等,直至您需要和可以支持的任何級別的複雜性。

通過在您的主幹或開發分支上使用外部結構,您可以擁有一個結賬,以您需要的任何結構構建您的工作區。由於所有庫都位於主根目錄下,因此您可以多次簽出多個版本,而不會在構建中發生衝突。

我發現這個系統工作得很好,並且在將作業移動到一個不以這種方式工作的地方之後,我發現自己正在爲之前的工作方式而奮鬥。有問題,主要是依靠圖書館來處理圖書館,以及是否有遞歸外部。我認爲這是遞歸的,除非它引起一個問題(或者過度的痛苦),然後轉向一個'退化'模型,在這個模型中,項目必須知道某些'深層'依賴項,即使它不直接使用它們。另外,決定在哪裏放置你的外部定義並堅持下去,沒有什麼比在不同項目中隨機文件夾中尋找svn:externals屬性更煩人的了。把它們放在樹幹的根部是沒問題的。

0

這是一個很難解決的問題,高端解決方案是使用「software product lines」管理系統(例如pure::variants)。然而,我們大多數人不會在源代碼控制系統上花費那些匹配。

因此,我會與佈局A - 每個庫分別版本。不過,我傾向於在「分支」之下放置「中繼線」,因爲它是分支,我希望所有分支都距離頂端相同的距離。

下一步寧願取決於您的構建系統,我假設Visual Studio在這裏。

  • 在每一個產品分支樹的根
  • 創建定義包含您希望使用
  • 編輯Visual Studio項目文件,每個庫的分支名稱的環境變量一個bat文件使用這些環境變量
  • 從Visual Studio的命令提示符批處理文件中引用的庫啓動Visual Studio的

之前,您還可以看看寫丘斯托MSBuild文件,而不是使用批處理文件。或者在您更改庫的版本時編寫一個編輯所有項目文件的工具。

如果您只有1個或2個共享庫,並且它們一次只能更換一個產品,例如.e.g。爲正在進行的項目添加新方法。我會考慮爲每個項目分配不同的庫,並使用SVN 1.5合併來追蹤發生的事情。 (如果變化穩定,合併到卡車,然後在需要時從卡車合併到每個項目分支)

(如果您有100個圖書館,則必須跟蹤每個圖書館需要彼此的女巫版本。 !變得非常複雜)

我不喜歡的svn:外部,因爲它不是從文件系統中清除您的本地PC是怎麼回事的。然而svn:external是一個可行的解決方案。

0

通過類似的問題,我知道你的痛苦。管理具有分層組件的存儲庫中的依賴關係是一個難題。

我們的項目有幾個產品(不管你運送到客戶)由各種組件(其中有許多是共享)的。我們每個組件都有自己的tags/branches/trunk三部曲,非常像您的佈局A(畢竟是推薦的方式)。

我們沒有使用svn:externals爲每個產品指定相關組件(和子組件等)的方式,並在第一次工作得相當好。但最終我們遇到了一些問題,例如分支時會發生什麼,如果某個產品需要針對特定​​版本進行修改,如何通過外部代碼傳播標籤以進行配置管理(這樣您可以重新構建相同的樹)! , 等等。所以svn:externals解決了一些問題,但引入了其他問題。

我最後寫一些腳本來管理這一點,但它仍然是一個有點令人費解。幸運的是,您可以使用Python-Subversion綁定編寫Python應用程序來操作屬性,因此您可以執行諸如通過從屬組件傳播標籤等事情。

有其目的是解決這個問題非常依賴模塊的問題一個項目,叫Piston。對於這類問題,它看起來像一個非常好的通用工具。我沒有將它部署到生產環境中,但當時看起來它會完成我們所需要的大部分工作。它看起來像是比外部提供的更靈活的解決方案(這仍然是一個非常手動的過程)。

底線:您可以使用Layout A,並使用Piston來管理依賴關係,以便將所有正確版本的庫裝配到工作目錄中。

+0

活塞似乎沒有任何概述文檔。我只看到子命令的「手冊頁」。是否有任何文檔描述了你應該如何使用它以及它做了什麼? – 2009-09-24 16:13:01

+0

是的,我明白你的意思。這些網頁有一個合理的概述:http://www.rubyinside.com/advent2006/12-piston.html和http://www.yup.com/articles/2006/11/01/better-subversion-external-branch - 管理 - 與活塞 – gavinb 2009-09-25 10:21:16