2010-06-28 47 views
14

有很多網頁,建議hackish ways to make svn externals look like git submodules。我已閱讀的區別是什麼some accounts,但這似乎並不很基本的:爲什麼git子模塊與svn externals不兼容?

Git的子模塊鏈接到一個特定的承諾在其他項目的存儲庫,而SVN:永遠的外部獲取最新版本。

爲什麼這種差異使他們從根本上不兼容?是不是有一個我們可以假設的合理的默認值,比如大多數svn:externals指向永不移動的標籤?

+0

請注意,如http://stackoverflow.com/a/9189815/6309中所述,並在我下面更新的答案中提到,子模塊現在可以最新跟蹤分支。 – VonC 2013-04-03 09:12:17

回答

10

基本區別在於構圖規則

在真正的基於組件的方法,你定義一個configuration,那就是:
標籤列表(的SHA1提交對GIT)您需要爲您的項目爲「工作」(即「發展「,」編譯「,」部署「,...)。

配置中引用的每個提交都可以幫助您獲取所有樹的確切版本。沒有例外。該樹的每個文件都是由您定義的配置指定的確切版本。


注意事項git1.8.2

「混帳子模塊」開始學習一種新的模式與遠程分支的頂端集成(而不是與此提交記錄在上層項目的gitlink整合) 。

所以很快(2013年3月),子模塊可以引用上游HEAD,而不僅僅是固定的SHA1。


(在1.8.2之前)每個模塊只能有一個標籤/ SHA1。從一個共同的家長回購,你不能在一個模塊內定義一個模塊。
(但是一個模塊只是對外部Git倉庫的引用,可以有自己的子模塊定義:父倉庫只會引用第一級子模塊,而後者會引用它自己內部提交的子模塊)


SVN external沒有這樣:你可以定義外部外部目錄以及文件,有或沒有在其指定版本。
您可以撰寫各種外部屬性。例如:

$ svn propget svn:externals calc 
third-party/sounds    http://svn.example.com/repos/sounds 
third-party/skins -r148  http://svn.example.com/skinproj 
third-party/skins/toolkit -r21 http://svn.example.com/skin-maker 

結果不是一個配置(「calc‘一個參考),但它定義了確切的‘拼湊’的選擇規則的組合物你在目錄’calc


需要

簡而言之,您無法「計算」'calc'子模塊的一個SHA1,這與'calc'SVN目錄中一堆svn:external屬性的確切等價。

+0

對自己的注意:ClearCase是VCS的另一個例子,允許在其版本選擇機制中進行合成...除了它已經使用更新的方法UCM放棄了這種模式:請參閱http://stackoverflow.com/questions/763099/flexible- vs-static-branch-git-vs-clearcase-accurev/764219#764219 – VonC 2010-06-28 17:00:14

+0

寫得很好。但是......當你檢查SVN父項時,無論外部是否移動,你都希望它能夠編譯和工作。因此,當你將git svn clone作爲父對象時,至少在缺省情況下,對這個特定修訂進行散列是不夠的。 – 2010-06-28 22:19:49

+0

@Andres:那麼你會怎樣'git svn dcommit'呢?你會如何推回你在Git倉庫的「submodule」部分所做的任何更改(請參閱「submodules的真實性質」http://stackoverflow.com/questions/1979167/git-submodule-update/1979194#1979194 ),它實際上對應於幾個SVN回購,其中一些顯式修訂不應該移動? – VonC 2010-06-29 04:14:35

3

如果您使用SmartGit與svn:externalls一起使用SVN信息庫,您將不會注意到任何真正的區別。實際上,唯一真正的區別(至少唯一的技術區別)是SVN允許外部指向HEAD修訂版(不是固定值),Git子模塊則不允許。在我看來,所有其他的差異都是微不足道的,所以你是對的。