【问题标题】:using submodules in git for the timid在 git 中为胆小者使用子模块
【发布时间】:2016-03-10 06:18:07
【问题描述】:

我正在一个项目中工作,该项目层数很少,每个层都是独立的子项目。

看起来像这样:

[ Project C ] [ Project D ]  C and D uses B and therefore A
[ Project B ]                B has all source code in a and adds more
[ Project A ]                

将上游设置为父存储库并发出git pull upstream 可以很好地从上层项目中获取更改。

但是,在 C 中的 bug 修复会影响与父层共享的代码的情况下,我将如何推送提交?

如果我从项目 A 发出git pull project-D,它也会合并该层添加的所有源代码。

我也考虑过使用sub-treessubmodules,但看起来还是很复杂。

【问题讨论】:

    标签: git github git-submodules


    【解决方案1】:

    * 我也考虑过使用sub-treessubmodules,但看起来还是很复杂。*

    这正是您需要使用的。让我解释一下它是多么简单而不那么复杂

    Submodules 始终允许将外部存储库嵌入到源代码树的专用子目录中指向一个特定的提交。


    git submodule

    像您目前所做的那样,将您的大项目分解为子项目。
    现在将每个子项目添加到您的主项目中:

    git submodule add <url>
    

    将投影添加到您的存储库后,您必须初始化并更新它。

    git submodule init
    git submodule update
    

    Git 1.8.2 开始,添加了新选项 --remote

    git submodule update --remote --merge
    

    fetch从上游的每个子模块中的最新更改,merge them in,以及check out 子模块的最新版本。

    正如the docs 描述的那样:

    --remote

    此选项仅对更新命令有效。不要使用超级项目记录的 SHA-1 来更新子模块,而是使用子模块的远程跟踪分支的状态。

    这相当于在每个子模块中运行 git pull。


    但是,在 C 中的 bug 修复会影响与父层共享的代码的情况下,我将如何推送提交?

    再次重申:使用子模块会将您的代码作为其内容的一部分放在主项目中。将其本地放在文件夹中或将其作为子模块的一部分之间的区别在于,在子模块中,内容被管理(提交)到不同的独立存储库。


    这是子模块的图示 - 另一个项目中的项目,其中每个项目都是一个独立的项目。


    git subtree

    Git 子树允许您插入任何存储库作为另一个存储库的子目录

    submodule 非常相似,但主要区别在于代码的管理位置。在子模块中,内容被放置在一个单独的 repo 中并在那里进行管理,这允许您将其克隆到许多其他 repo。

    subtree 将内容作为根项目的一部分进行管理,而不是在单独的项目中。

    您无需写下如何设置它以及了解如何使用它,您只需阅读这篇将解释一切的优秀文章。

    https://developer.atlassian.com/blog/2015/05/the-power-of-git-subtree/

    【讨论】:

    • 这是一个非常详细的答案,实际上我对它的工作原理有了更好的了解。 @codeWizard,我想知道 github 中是否有任何遵循该架构的 Autotools C++ 项目。据我所知,autotools 允许拥有一个“伞形”项目,但在不复制任何代码部分(甚至 Makefile.am 或 configure.ac)的情况下实现它可能非常复杂。我知道在这篇文章中提到 Autotools 是题外话,但我想知道您是否对此有任何想法
    • 这是一个示例项目:github.com/nvie/gitflow shFlags 是一个子模块。另一个 c++ 代码示例:github.com/mfontanini/libtins 但子模块与您使用的代码语言无关。
    • 我没有使用自动工具的经验,但很乐意帮助您解决任何 Git 问题 :-)
    猜你喜欢
    • 2021-03-07
    • 2016-11-13
    • 1970-01-01
    • 2015-10-25
    • 2013-04-07
    • 2015-04-24
    • 2021-11-22
    • 1970-01-01
    • 2012-05-18
    相关资源
    最近更新 更多