如何根据超级项目分支

时间:2016-08-19 13:22:20

标签: git git-submodules git-subtree

我一直在研究Git子模块,以便在Git项目中创建一个“Git项目”,但我遇到了一个问题,告诉我子模块可能不是正确的解决方案。

让我解释一下我要做的事情:

目前我有一个包含多个分支(主要和开发)的项目和一个我想要分成它自己的Git项目的库(因此可以独立开发并使用它自己的提交历史记录)。具体来说,我也希望能够:

  1. 在明确要求之前,在超级项目中更新的库项目的单独克隆中提交并推送更改。
  2. 在超级项目主分支上使用库主分支。
  3. 在超级项目开发分支上使用库开发分支。
  4. 能够:(但不是必需的)能够:

    1. 从超级项目中提交并推送对库项目的更改。
    2. 据我所知,Git子模块支持#1和#4(即使#4需要一些额外的检查以确保你在正确的分支上)。 #2和#3没那么多。

      我查看了Differences between git submodule and subtreeVendor Branches in Git,但似乎都没有提供我要求的功能 - 是否可以使用Git实现?是否有可能没有大量额外的移动/重命名/检查目录?

1 个答案:

答案 0 :(得分:0)

您的要求1-3可以通过子模块实现。要求4可以通过子树实现,但仅限于子模块。

首先,请注意,在不同项目/回购之间进行多次交互必然需要许多干预措施才能使项目保持同步。 (通过交互,我的意思是子模块的微小变化需要对子项目进行更改。)

有两件事需要注意:

  • 子模块的当前提交存储在超级项目的每个 commit 中。
  • 子模块仅存储提交ID ,但从不存储特定分支。

具体来说,每次要更新子模块时,都必须

  1. 手动检查子模块中的最新版本
  2. 在超级项目中提交新的子模块HEAD。
  3. 如果您很少更新子模块(不确定子树),则子模块很有意义。至少,这是我的印象。 我经常使用子模块来确保代码是可重现的(实际上,这毕竟是什么版本控制)。 即,为了对提交X的#34;等信息进行编码,我们需要提交子模块A&#34 ;.

    在两个项目之间建立稳定的接口是限制交互的关键。

    当您在超级项目中切换分支时,git子模块将知道它必须位于特定子模块的该分支的提交中。 然而

    1. git既不会自动检查该提交 - 您必须手动运行git submodule update
    2. 不会git自动拉出子模块原点的变化。
    3. 所以,是的,子模块提供了要求1-3,尽管有一些手工工作。

      1. 子模块只是一个克隆。因此,您可以独立处理子模块的原点,而无需进行更改。
      2. 为每个超级项目提交单独保存子模块的提交。因此,您对不同的分支有不同的子模块提交。请记得运行git submodule update
      3. 见2.
      4. 只能在子模块目录中的中完成。因此cd submodule; git commit; git push有效。