如何根据超级项目分支切换子模块分支

3
我一直在研究Git子模块,以便在一个Git项目中嵌套另一个Git项目,但我遇到了一个问题,告诉我子模块可能不是正确的解决方案。
让我解释一下我的想法:
目前,我有一个带有多个分支(主分支和开发分支)和一个库的单个项目,我想将其分离为自己的Git项目(这样可以独立开发并具有自己的提交历史记录)。具体来说,我还想能够:
1. 在库项目的单独克隆中提交和推送更改,这些更改在未明确要求之前不会更新到超级项目中。 2. 当处于超级项目主分支时使用库主分支。 3. 当处于超级项目开发分支时使用库开发分支。
如果能做到以下功能就更好了(但不是必需的):
4. 从超级项目内部提交和推送到库项目。
据我所知,Git子模块支持#1和#4(即使#4需要进行一些额外的检查以确保您处于正确的分支上)。#2和#3则不太支持。
我已经查看了Git子模块和子树之间的区别Git中的供应商分支,但两者似乎都没有提供我所要求的完全功能。是否可以使用Git实现?是否可以在不进行大量额外移动/重命名/检出目录的情况下实现?

你遇到了哪些问题? - Martin Nyolt
这个建议可能不适用于你的情况,但通常情况下,如果一个模块需要在依赖模块也在开发分支上时才能使用,我经常会选择将两个模块放在同一个代码库中。 - Dietrich Epp
如果该模块是外部服务的客户端库,而您正在准备开发分支以使用更新版本,那该怎么办?我敢打赌这是一个非常常见的用例。 - Woodgnome
1个回答

0

您的1-3要求可以通过子模块实现。第4个要求可以通过子树实现,但只能在子模块中以有限的方式实现。

首先,请注意,不同项目/仓库之间的许多交互必然需要许多干预来保持项目同步。(通过交互,我指的是对子模块的小更改需要对子项目进行更改。)

有两件事需要注意:

  • 每个超级项目的每个提交都存储了子模块的当前提交。
  • 子模块仅存储提交ID,而不是特定分支。

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

  1. 手动检查子模块中的最新版本
  2. 在超级项目中提交新的子模块HEAD。

如果您很少更新子模块,则子模块基本上是有意义的(虽然对于子树我不确定)。至少,这是我的印象。 我经常使用子模块作为某种方式来确保代码可重复使用(毕竟,这就是版本控制的目的)。 也就是说,编码类似于“对于提交X,我们需要子模块A的提交Y”的信息。

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

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

  1. git不会自动检查该提交 - 您必须手动运行git submodule update
  2. git也不会自动拉取子模块源的更改。

因此,是的,子模块提供了要求1-3,但需要一些手动操作。

  1. 子模块只是一个克隆。因此,您可以独立地在子模块的源上工作而不必拉取更改。
  2. 子模块的提交针对每个超级项目的提交单独保存。因此,您在不同的分支上有不同的子模块提交。但请记得运行git submodule update
  3. 参见2。
  4. 只能在子模块目录内完成。因此,cd submodule; git commit; git push有效。

我不确定这是否解决了以下问题:
  1. 子模块位于开发分支。
  2. 超级项目开发分支现已合并到主分支。
  3. 在超级项目中运行git submodule update。
  4. 现在,超级项目具有子模块的开发分支(我仍希望它是主分支)。
或者我是否误解了您的解释?
- Woodgnome
每次想要更新子模块时,您都需要手动检出子模块中的最新版本。此外,我还解释了子模块的提交是按照超级项目提交存储的。因此,在合并过程中或之后,您需要手动检出子模块的主分支。 - Martin Nyolt

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接