幾個問題:在主項目作出了
客戶端項目的一些變化(全球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/stuff
的trunk
。如果你分支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
從存儲庫中的一個位置移動到另一個位置。您可以在不影響其他項目的情況下進行更改,反之亦然。更好的是,您可以在兩個位置之間來回地合併更改,以使它們保持同步。
希望這回答你的問題。如果你可以擴大你的問題,並給我們更多關於你想要什麼的細節,我將能夠更新我的答案。
就我所見,您已經在標籤中指定了'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