为什么git子模块与svn externals不兼容?

时间:2010-06-28 11:26:19

标签: svn git git-svn git-submodules svn-externals

有很多网页建议hackish ways to make svn externals look like git submodules。我已经阅读了some accounts的不同之处,但这似乎不是很基础:

  

Git子模块链接到另一个项目的存储库中的特定提交,而svn:externals总是获取最新版本。

为什么这种差异使它们根本不兼容?我们可以假设没有合理的默认值,例如大多数svn:externals指向永不移动的标签?

2 个答案:

答案 0 :(得分:10)

根本区别在于构图规则

在真正的基于组件的方法中,您可以定义 configuration ,即:
项目“工作”所需的标签列表(对于Git的SHA1提交)(即“开发”,“编译”,“部署”,......)。

配置中引用的每个提交都可以帮助您获取所有树的确切版本。没有例外。该树的每个文件都是您定义的配置指定的确切版本。


git1.8.2的注释

  

“git submodule”开始学习一种新模式与远程分支的尖端集成(而不是与超级项目的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,这个子模块与“svn:external”SVN目录上的一堆calc属性完全等效

答案 1 :(得分:3)

如果您使用SmartGit与svn:externalls一起使用SVN存储库,您将不会注意到任何真正的差异。

实际上,唯一真正的区别(至少是唯一的技术差异)是SVN允许外部指向HEAD修订版(不是固定值),Git子模块不允许。在我看来,所有其他差异都是微不足道的,所以你提出这个问题是正确的。