【问题标题】:Differences between git submodule and subtreegit子模块和子树的区别
【发布时间】:2015-10-24 12:41:30
【问题描述】:

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

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

【问题讨论】:

标签: git git-submodules git-subtree


【解决方案1】:

子模块是链接;

子树被复制

【讨论】:

    【解决方案2】:

    如果我希望链接始终指向外部 repo 的 HEAD,该怎么办?

    您可以使子模块跟随子模块远程仓库分支的 HEAD,使用:

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


    另外,正如the comments 中的philb 所述,git subtreecontrib/,而不是git submodule(核心命令)

    【讨论】:

    • 您的答案似乎与这里的投票答案背道而驰:stackoverflow.com/questions/10443627/…
    • @NathanH this(跟踪 HEAD 的可能性)已在一年后添加(2013 年 3 月,git 1.8.2:github.com/git/git/blob/…
    • 我看到your other anwer 中也提到了子模块的跟随行为。在这种情况下,我认为您的意思是说始终指向子模块的 HEAD 是通过在更新命令上同时使用 add -b--remote 来完成的,根据 submodule update documentation。在那种情况下,跟随主人的 HEAD 真的还需要-b 吗?
    • @matt -b 用于为子模块生成正确的.gitmodule 元数据(相当于git config -f .gitmodules submodule.<path>.branch <branch>)。
    • @philb 好点。我已将您的评论包含在答案中以提高知名度。
    【解决方案3】:

    概念上的区别是:

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

    使用 git subtree 您可以将另一个存储库集成到您的存储库中,包括它的历史记录。所以在集成它之后,你的存储库的大小可能会更大(所以这不是保持存储库更小的策略)。 集成后没有与其他存储库的连接,除非您想获得更新,否则您不需要访问它。所以这个策略更多是为了代码和历史的重用——我个人不使用它。

    【讨论】:

    • 但是使用git subtree 你仍然可以推送——如果你愿意的话——对吧?
    • @lxx 如果您知道存储库 URL...
    • @FranklinYu 他为什么不知道呢?无法从本地 git 元数据中获取该信息?
    • @adi518 是的,如果您是创建子树的人。但是,如果您将存储库推送到 GitHub 并且其他人将其克隆下来,我认为他/她不会自动知道子树 URL。
    • @NiklasP - 你能详细说明“引用主存储库中的新提交”吗?这是我不清楚如何执行的一步,因此“更改参考”也不是我理解的。
    【解决方案4】:

    子模块
    将主仓库推送到远程不会推送子模块的文件

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

    【讨论】:

    • "将主仓库推送到远程推送子树的文件" 不,它没有。
    • @JBramble 我应该提到它是通过 SourceTree 应用程序完成的,例如:git -c diff.mnemonicprefix=false -c core.quotepath=false -c credential.helper=sourcetree push -v --tags production refs/heads/master:refs/heads/master
    猜你喜欢
    • 2019-06-07
    • 2012-05-14
    • 2015-03-28
    • 1970-01-01
    • 2016-12-08
    • 1970-01-01
    • 1970-01-01
    • 2011-10-23
    • 2014-09-30
    相关资源
    最近更新 更多