2013-04-11 58 views
4

在SVN存儲庫中有一個大項目。我想在其他應用程序中使用該項目的一些模塊,所以我想從我的主要SVN存儲庫中檢出它們,以便我可以更新我的代碼。svn子樹,從一個回購更新,提交到其他

如何「導出」我的存儲庫的一個文件夾/模塊,以便我只能將該模塊簽出到其他項目?我希望包含該模塊的其他項目也位於其自己的SVN存儲庫中。

在簡歷中,我希望能夠對主repo執行SVN更新,但是要提交到項目repo。

我希望它清楚我想做什麼。

針對DavidW anwser:

  • 我有多個項目一個資料庫,但如果需要的話我可能會改變這個 。
  • 我想破解源代碼。它的一個PHP項目。我在 分叉模塊。 (我有一個全球通用的項目,如果我
    客戶需要一些特定的功能,
  • 我想創建一個客戶端一個單獨的項目(在SVN也分開),但我想
    有辦法合併
+0

就我所見,您已經在標籤中指定了'svn:externals'。那麼問題是什麼?請參閱相關文檔:http://svnbook.red-bean.com/en/1.7/svn.advanced.externals.html和http://tortoisesvn.net/docs/release/TortoiseSVN_en/tsvn-howto-common-projects。 html#tsvn-howto-common-externals – bahrep 2013-04-11 12:54:16

回答

1

幾個問題:在主項目作出了
客戶端項目的一些變化(全球bug修復或的funcionality前):

  • 你說的是多個倉庫或多個p在相同的存儲庫中的對象?
  • 如果你借用這個其他模塊的代碼,你保持它與其他模塊同步,還是你分叉該模塊?
  • 你是什麼真的想分享?您是否必須共享源代碼或編譯後的輸出(Unix C/C +中的*.so*.a,Java中的*.jar等)。

您要給出的答案很大程度上取決於您對這些問題的回答。

我們假設代碼實際上是共享的。你在一方面做的是你想在另一方面完成的事情。您在您的項目中進行更改,其他項目中的代碼也會更改。

在這種情況下,請使用svn:externals。這是放置在目錄上的屬性。它所做的是將Subversion URL與子目錄名稱相關聯。例如:

$ svn propset svn:externals "http://svn.vegibanc.com/svn/trunk/project/stuff utils" . 

將屬性放在當前目錄中。當您進行更新或結賬時,您的項目中將創建一個名爲utils的目錄,並且Subversion將自動檢出http://svn.vegibanc.com/svn/trunk/project/stuff到該目錄中。這很神奇,但像所有的魔法一樣,它既有明亮的一面,又有黑暗的一面。

首先光側的:

這兩個項目之間共享代碼。您在utils目錄中進行更改並提交更改,並且將更新project中的stuff子目錄。我使用它來將工具構建到我的項目中。如果我升級該工具,所有項目都會獲得升級的工具。現在

,黑暗的一面:

如果定義了svn:externals就像我給你,你會懊悔不已。想象一下,如果你決定分發你的作品發佈。那麼,你的utils目錄仍然指向project/stufftrunk。如果你分支2.1版,而trunk現在在2.2上工作,你會得到你不想要的東西utils

更糟的是,如果您創建了一個標籤,該標籤將繼續發生變化,因爲trunk中的utils目錄仍在更改中。

因此,強烈建議您指定一個確切的版本一個URL:

$ svn propset svn:externals "-r23283 ^/trunk/project/[email protected] utils" . 
$ svn propset svn:externals "^/tags/2.3.3/project/stuff utils" . 

在第一階段,我指的是一個特定修訂的URL。這是完全不變的。如果我需要將其指向另一個修訂版本,則需要更改svn:externals屬性本身。

第二個是指向一個特定的標籤。它不是安全因爲標籤可以改變,但我可以把我的外部依賴作爲釋放這種方式。我正在使用版本2.3.3的東西實用程序。

兩者都使用^快捷方式,它只是表示Subversion存儲庫根。這樣,如果你將你的Subversion版本庫移動到另一個系統,或者從http改爲svn,你的外部設備仍然可以工作。 當然,如果您這樣做,您將永遠無法更改svn:externals下的代碼。而且,這不是你想要的。

您也可以使用相對網址,但他們關心更危險一點。

想象一下你的兩個項目就是這樣,和你想的東西目錄svn:external鏈接utils的目錄:

http://svn.vegibanc.com/svn/trunk/project/foo/stuff 
http://svn.vegibanc.com/svn/trunk/project/bar/utils 

該項目支在一起,一起標記。你可以這樣做:

$ co http://svn.vegibanc.com/svn/trunk/project/bar bar-trunk 
$ cd project-bar 
$ svn propset svn:externals "../foo/stuff utils" . 

這將外部鏈接東西目錄到utils的目錄。但是,它是以相對的方式完成的。如果你這樣做:

$ cp http://svn.vegibanc.com/svn/trunk http://svn.vegibank.com/svn/branches/2.3 

utils的目錄仍然會被外部鏈接給foo的項目下的東西目錄,但他們都將是在2.3分支。

更改中的代碼將更改foo/stuff中的代碼,反之亦然。您仍然在共享代碼,但兩種項目仍處於同一分支中。

後來,如果您標記是這樣的:

$ cp http://svn.vegibank.com/svn/branches/2.3 http://svn.vegibank.com/svn/tags/2.3.0 

您的代碼2.3.0不太可能改變,因爲外部鏈接,它們鏈接到全部由該標籤包裹的東西。

以上假設您正在共享代碼,並且任一項目中的更改都會影響其他項目。

更好的方法是爲foo創建可存儲在發佈服務器上的某種類型的編譯對象(如JAR文件或* .so)。您將此編譯對象視爲自己的項目,並使用其自己的版本,並且您的項目將取決於此對象的特定版本。不幸的是,這並不總是奏效。

如果您只是分支代碼,請將svn cp從存儲庫中的一個位置移動到另一個位置。您可以在不影響其他項目的情況下進行更改,反之亦然。更好的是,您可以在兩個位置之間來回地合併更改,以使它們保持同步。

希望這回答你的問題。如果你可以擴大你的問題,並給我們更多關於你想要什麼的細節,我將能夠更新我的答案。

+0

嗨David.I已回覆您的問題在我的文章中。基於你的回答,我認爲我需要的是cp命令。我可以爲每個客戶端項目創建一個分支/標記,例如,如果我在主分支中進行一些錯誤修復,我可以將該錯誤修復與我的所有客戶端項目分支合併。我有理解它嗎?非常感謝您的詳細解答。 – brpaz 2013-04-11 18:13:20

+0

@ Bruno-P是的。如果您的項目與其他項目是同一個存儲庫的一部分,並且您不希望更改完全同步,那麼處理此問題的最佳方法是使用'svn cp'來創建您的項目。從一個代碼更改不會自動*顯示在另一個。但是,您可以使用'svn merge'來同步更改。 – 2013-04-11 19:27:07

1
  • 如果你想使用Subversion版本庫的共享代碼 - 它的SVN:外部組件
  • 如果你想從主線上共享代碼端口更改成共享代碼客戶特定的版本 - 這是「賣主分支」在SVN行話

組合a)和b)會給你所需要的結果

  1. 選擇一些節點(客戶的倉庫外主幹),其中你會鏈接到共享節點的DEV-回購
  2. 創建外部定義(首選PEG修訂版,如果在提交到dev-repo之後必須手動更新定義的成本,則必須有簡單的時間返回)
  3. 將節點複製到位置,其中必須在現場項目(svn cp ...
  4. 代碼...
  5. 當你在DEV-回購的變化,要轉移到客戶回購 - 更新的外部對需要修訂,合併「供應商」節點「活」

樣品:

如果您「會在客戶的回購

  • /供應商/ lib目錄(其中lib是從國外回購目錄) * /主幹/ common/lib目錄(客戶版以上的lib)

從LIB-主線將更改合併從/供應商/ lib添加/主幹/ common/lib目錄(在工作拷貝的相應節點的主幹)

大衛的有關的外部筆記仍然有效的,正確的和有益的合併