git - 如何根据 super 项目分支切换子模块分支

标签 git git-submodules git-subtree

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

让我解释一下我想做什么:

目前我有一个包含多个分支(master 和 development)的项目和一个库,我想将其分离到它自己的 Git 项目中(这样它就可以独立开发并有自己的提交历史)。具体来说,我还希望能够:

  1. 在库项目的单独克隆中提交和推送更改,这些更改不会在 super 项目中更新,直到明确要求为止。
  2. 在 super 项目 master 分支上使用库 master 分支。
  3. 在 super 项目开发分支上使用库开发分支。

如果能够(但不是必需的)也很好:

  1. 从 super 项目中提交并推送对库项目的更改。

据我所知#1 和#4 受 Git 子模块的支持(尽管#4 需要一些额外的检查以确保您在正确的分支上)。 #2 和 #3 没那么多。

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

最佳答案

你的需求1-3可以通过子模块来实现。要求 4 可以通过子树实现,但只能通过子模块以有限的方式实现。

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

有两点需要注意:

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

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

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

如果您很少更新子模块(尽管不确定子树),则子模块最有意义。至少,这是我的印象。 我经常使用子模块来确保代码可重现(实际上,毕竟这就是版本控制的目的)。 即,要对诸如“对于提交 X,我们需要子模块 A 的提交 Y”之类的信息进行编码。

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

当您在 super 项目中切换分支时,git 子模块将知道它必须在该分支的特定子模块的提交中。 但是

  1. git 不会自动检查提交 - 你必须手动运行 git submodule update
  2. git 不会自动 pull 子模块来源的更改。

所以,是的,子模块提供了 1-3 的要求,尽管需要一些手动工作。

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

关于git - 如何根据 super 项目分支切换子模块分支,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39040179/

相关文章:

Git - 将 dist 文件夹部署到不同的远程

git - 如何查看git子树的历史记录?

git - 在特定提交中获取文件的 SHA 哈希

git - 无法从 Assembla 克隆

android - 如何自动在apk文件名中包含git分支名称

公司网络上的 git SSL 问题

.net - 使用 VS 解决方案的 git 子模块时如何解析 nuget 包

github - 子模块在 github 页面中的行为如何?

git - 如何让git默认忽略对子模块的更改

Git 子树 : Use only subrepository instead of whole repository