git子模块和子树的区别
使用git子模块和子树有什么概念上的区别?
每个典型的场景是什么?
- 子模块更适合基于组件的开发 ,其中您的主要项目取决于另一个组件(回购)的固定版本。
您只保留在您的父回购( gitlinks , 索引中的特殊条目 )
如果我想要链接总是指向外部回购的头部?
您可以使子模块遵循子模块远程回购的分支的HEAD,其中:
o git submodule add -b <branch> <repository> [<path>]
。 (指定要遵循的分支)
o git submodule update --remote
将默认的origin/master
将子模块的内容从<repository>/<branch>
更新到最新的HEAD。 即使使用了--remote
您的主项目仍然会跟踪子模块HEAD的散列值。
- 子树更像是一个基于系统的开发 ,您的所有回购一次包含所有内容,您可以修改任何部分。
在这个答案中看到一个例子 。
子模块是链接;
子树是复制
概念上的差异是:
使用git子模块通常需要将大型存储库分成较小的存储库。 引用一个子模块的方法是maven风格 – 你从另一个(子模块)存储库引用一个提交。 如果您需要在子模块中进行更改,则必须在子模块中进行提交/推送,然后引用主存储库中的新提交,然后提交/推送主存储库的已更改引用。 这样,您必须有权访问这两个存储库的完整版本。
使用git子树,您可以在其中整合另一个存储库,包括其历史logging。 所以在集成之后,你的版本库的大小可能会更大(所以这不是保持版本库更小的策略)。 集成之后,没有连接到其他存储库,除非想获取更新,否则不需要访问它。 所以这个策略更多的是代码和历史的重用 – 我个人不使用它。
子模块
推一个主要的repo到远程不会推子模块的文件
子树
推一个主要的回购远程推子树的文件