2008-12-17 119 views
16

當我第一次爲不同的項目設置SVN結構時,我決定將每個不同的項目放置在單獨的存儲庫中。顛覆 - 合併存儲庫

這已經很好運行了一段時間,但我盯着認爲我想將所有這些存儲庫合併到一個整體「公司範圍」存儲庫中,因此當我讓員工檢查源代碼時,他們只需從頂部簽出即可獲得所有不同項目的所有代碼。

我在網上發現了svn-merge-repos命令,但沒有提供很多用戶反饋或有用的提示。這是加入存儲庫的最佳方式,所以我不會丟失我的歷史數據,或者有更好的方法嗎?我應該注意哪些缺陷?

謝謝。

+0

http://geekswithblogs.net/kariemali/archive/2009/06/02/how-to-merge-two-svn-repositories.aspx – JDPeckham 2012-07-12 15:40:17

回答

9

請不要強迫您的用戶檢出整個存儲庫以構建內容。這是回到舊的sourcesafe模型,它不是那麼好。

每個項目有一個存儲庫是罰款。 如果project1需要來自project2的代碼,請將「svn:externals」屬性添加到project1的trunk中,從而將project2帶入project1目錄下的合理位置。如果project2需要project3的代碼,它也可以擁有一個外部屬性並將代碼放在它的下面。

實際上,如果外部引用總是指向一個標記或一個特定的修訂版本,但如果避免出現「巨大的工程空間」問題,我會讓您指向主幹。

如果你與外部合作,任何人都可以結賬他們想要的項目,並自動得到所有的依賴關係,只是建立 - 就像你想要的。他們所有的代碼都包含在一個單獨的工作目錄中,其中包含了他們所需要的東西,他們可以將多個項目的多個版本檢入到不同的工作目錄中,而不會浪費空間,並且還能夠跟蹤到底是怎麼回事。

如果project1希望在其項目文件夾之外找到project2而不是內部,那麼它可能需要對工作區進行一些小的重構,但這是對宏塊方案的微小調整。

如果你真的把自己的心設置在一個存儲庫上,那也沒關係(這就是我們在工作場所和家中使用的想法),但是確保你有一個每個項目的結構有它自己的標籤,主幹&分支文件夾,檢出項目1的主幹爲,您只需要做即可獲取project1的代碼。

最後,如果您確實需要項目的時髦佈局,您可以添加一個額外的單個存儲庫,基本上這是一個元存儲庫。 該存儲庫將包含每個頂級項目的1個目錄(帶有trunk標籤&分支),並使用外部參考,引用所有其他項目,並按照您期望的方式構建時髦的工作區。

通過這種方式,通過添加額外的存儲庫,您可以在一個步驟中獲得簽出和構建的所有好處,並且至少可以管理由於與project2共享代碼而使project1需要的更改中斷project3的情況;你突然需要緊急修復project3。

+5

這提出了一種替代解決方案,但實際上並沒有回答這個問題。我仍然想知道如何合併單獨的存儲庫。 – Justin 2009-11-13 23:03:32

4

您可以使用svn-merge-repos.pl,或者您可以合併多個存儲庫轉儲與SvnDumpTool合併,然後將結果轉儲加載到svnadmin load --ignore-uuid

請注意,所有修訂都將重新編號。

檢查SvnDumpTool readme的合併部分。

2

如果您只想將看作統一,您可以使用svn:externals屬性,以便單個簽出將從所有現有回購中拉入代碼。

1

不要這樣做。正如@KeithB所說,使用svn:externals引用它們應該沒問題。

將每個項目維護在自己的存儲庫上會更好,因此您可以輕鬆歸檔舊項目,並且還可以獲得更好的完整性。

例如,apache基金會爲其所有項目維護a single repository(我不知道它是從其他回購項目複製的還是活的項目)。目前,它的歷史重量爲700k +修訂版。我不希望看到這個怪物受到損壞。

21

最近,我不得不做類似的東西和我所做的是,在本質:

* svnadmin create X:\Repositories\RepositoryC 
* svn mkdir http://localhost:8080/svn/RepositoryC/branches --message "Added the branches folder." 
* svn mkdir http://localhost:8080/svn/RepositoryC/tags --message "Added the tags folder." 
* svn mkdir http://localhost:8080/svn/RepositoryC/trunk --message "Added the trunk folder." 
* svn mkdir http://localhost:8080/svn/RepositoryC/trunk/A --message "Added the trunk\A folder." 
* svn mkdir http://localhost:8080/svn/RepositoryC/trunk/B --message "Added the trunk\B folder." 
* svn checkout http://localhost:8080/svn/RepositoryC RepositoryC 
* svnadmin dump X:\Repositories\RepositoryA > RepositoryA.dmp 
* svnadmin dump X:\Repositories\RepositoryB > RepositoryB.dmp 
* svnadmin load X:\Repositories\RepositoryC --parent-dir trunk\A < RepositoryA.dmp 
* svnadmin load X:\Repositories\RepositoryC --parent-dir trunk\B < RepositoryB.dmp 
* svn checkout http://localhost:8080/svn/RepositoryC RepositoryC 

注:上面的代碼假定承載您的Subversion版本庫的機器上,X上存在的庫:\存儲庫和Subversion服務器的URL是http://localhost:8080,其中一個位於工作文件夾中。

此時,您將最終得到RepositoryC,它分別在trunk \ A和trunk \ B下包含RepositoryA和RepositoryB,最重要的是,您的更改歷史記錄將針對RepositoryA和RepositoryB進行維護。您的工作文件夾還包含一個名爲RepositoryC的文件夾,其中包含一個結算出RepositoryC的文件夾。

您現在可以在RepositoryC中移動東西來統一兩個存儲庫RepositoryA和RepositoryB的項目結構。

+0

令人印象深刻。無論如何將多個文件夾從一個存儲庫移動到另一個存儲庫..?你可以看看我的問題http://stackoverflow.com/questions/28238863/include-multiple-folders-using-svndumpfilter – 2015-02-01 12:43:40