git子模块-使用develop分支?

时间:2019-07-03 22:13:24

标签: git github git-submodules

在我的项目仓库中,我创建了一个子模块,在.submodules文件中,它看起来像这样:

[submodule "lib/payment-sdk"]
    path = lib/payment-sdk
    url = https://user@github.com/user/Payment-SDK.git 

我用以下命令初始化子模块:git submodule update --init --recursive,但是如何从developer分支获取最新信息?在生产服务器上,它将需要从master分支中拉出。

2 个答案:

答案 0 :(得分:1)

子模块的目标是获取特定于 的版本,而不仅仅是“最新”

如果最新版本在五分钟前更新为不兼容的版本会怎样?您的主模块不能使用该版本。因此,这不是子模块的工作。使用子模块时,可以在超级项目中选择特定的提交。超级项目实际上说:对于当前的超级项目提交,对子模块lib/payment-sdk 使用提交XYZ。子模块Git会按照超级项目git(git submodule update)的指示,忠实地检查该特定提交。

设置子模块的分支不会更改上面的内容。有关分支名称的用法,请参见脚注1。

现在,如果您正在使用 存储库,并且发现子模块有一个新提交,并且您想对其进行测试,则可以做到这一点很容易。只需输入子模块(毕竟这是一个单独的存储库),然后输入git checkout您要测试的提交。 1 在超级项目中构建和测试时,子模块仍保留在该提交上。如果一切顺利,那么在超级项目中,然后运行:

git add lib/payment-sdk

告诉 superproject 在您进行的下一次提交中,您希望superproject命令子模块使用与现在使用的相同的提交。

如果这是您需要对超级项目进行的唯一更新,则现在可以继续进行提交:

git commit

否则,例如,如果新的lib/payment-sdk需要对超级项目进行一些修复或更新,则需要进行其他任何超级项目更改,也git add进行修改,然后 git commit进行新的提交。


1 您也可以使用git submodule update --remote将其自动化,但是细节变得相当复杂。在大多数情况下,我个人更喜欢通过导航到子模块来直接控制每个子模块。如果您想使用git submodule update --remote,则 this 表示子模块的分支设置有意义。

此时,您现在必须选择以下三种特定模式之一:

  • checkout:这意味着切换到提交。子模块中要检出的提交的哈希ID由分支名称确定。

  • merge:这意味着将当前提交与另一个提交合并。用于合并的提交的哈希ID由分支名称确定。

  • rebase:这意味着将当前提交重新设置为另一个提交。用于重新设置的提交的哈希ID由分支名称确定。

在所有情况下,除非您用git submodulegit fetch禁止这样做,否则--no-fetch将首先在子模块存储库中运行-Ngit fetch操作将获取新的提交并更新名称,以便您先前设置的分支名称在git fetch之后采用新的哈希ID值。 请记住,git fetch获得了新的提交,并更新了origin/master之类的远程跟踪名称。 git fetch 必须必须在子模块Git中运行,而不是在超级项目Git中运行:毕竟,这些都是独立的,大多独立的Git存储库。因此,多合一git submodule update --remote操作就是这样做的:

  1. cd进入子模块;
  2. 运行git fetch;
  3. 使用您先前设置的分支名称(作为子模块的“分支”设置)来计算哈希ID,例如在步骤2中通过git fetch 进行更新;
  4. 使用该哈希ID进行第二次Git操作(例如git checkout)。

手动执行此操作-这样您就可以控制结果,而不是仅仅假设某些计算机程序已产生正确的答案(即42),即使您不确定问题是什么是-您可以执行相同的步骤,但实际上可能要先查看每个步骤,然后再继续下一个步骤。

答案 1 :(得分:0)

branch = develop添加到您的配置中,

[submodule "lib/payment-sdk"]
    path = lib/payment-sdk
    url = https://user@github.com/user/Payment-SDK.git 
    branch = develop

Documentation以支持此操作。

对于生产而言,我认为这行不通,因为据我所知,子模块仍将检出为develop。无论将代码部署到生产环境中的什么,都需要手动检出该子模块中的master分支。