为什么git submodules与svn externals不兼容?

这里有很多网页,说明如何让svn外部看起来像git子模块。 我已阅读了一些有关区别的说法,但这看起来并不很基本:

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

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


基本的区别是构图规则

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

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


注意git1.8.2

“git子模块”开始学习一种新的模式,以便与远程分支的提示集成(而不是与超级项目的gitlink中记录的提交进行集成)。

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


(在1.8.2之前)每个模块只能有一个标签/ SHA1。 从一个共同的家长回购,你不能在一个模块内定义一个模块。
(但是一个模块只是对外部Git仓库的引用,可以有自己的子模块定义:父仓库只会引用第一级子模块,而后者将引用自己在其内部提交的子模块)


SVN外部没有这样的情况:您可以定义目录外部以及外部文件,其中有或没有显式修订。
你可以编写各种外部属性。 例如:

$ 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 '中定义了你需要的精确“拼凑”


总之,你不能“计算”一个SHA1一个“ calc ”子模块这将是一堆的完全等效svn:external特性上的“ calc ” SVN目录。


如果您使用SmartGit与svn:externalls一起使用SVN信息库,您将不会注意到任何真正的区别。

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

链接地址: http://www.djcxy.com/p/92241.html

上一篇: Why are git submodules incompatible with svn externals?

下一篇: Source control vs. Revision Control?