git子模块和子树之间的差异

时间:2015-08-02 08:05:45

标签: git git-submodules git-subtree

使用git子模块和子树之间有什么概念上的区别?

每种情况的典型情况是什么?

4 个答案:

答案 0 :(得分:277)

子模块是链接;

子树是副本

答案 1 :(得分:153)

  

如果我希望链接始终指向外部仓库的HEAD怎么办?

您可以使子模块跟随子模块远程仓库的分支的HEAD,其中包含:

o git submodule add -b <branch> <repository> [<path>]。 (指定要遵循的分支)
o git submodule update --remote,它将从<repository>/<branch>更新子模块的内容到最新的HEAD,默认为origin/master。即使使用--remote,您的主项目仍将跟踪子模块的HEAD的哈希值。

答案 2 :(得分:103)

概念上的区别是:

使用 git子模块,您通常希望将大型存储库分隔为较小的存储库。引用子模块的方式是 maven-style - 您正在引用来自另一个(子模块)存储库的单个提交。如果您需要在子模块中进行更改,则必须在子模块中进行提交/推送,然后在主存储库中引用新提交,然后提交/推送更改的主存储库引用。这样,您必须能够访问两个存储库以进行完整构建。

使用 git子树,您可以在其中集成另一个存储库,包括其历史记录。因此,在集成它之后,存储库的大小可能更大(因此这不是保持存储库更小的策略)。 集成后,没有与其他存储库的连接,除非您想获得更新,否则您不需要访问它。因此,这种策略更适用于代码和历史重用 - 我个人不会使用它。

答案 3 :(得分:20)

<强>子模块
将主回购推送到远程不会推送子模块的文件

<强>子树
将主仓库推送到远程推送子树的文件