git 子模块 - 使用开发分支?

git submodule - use develop branch?

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

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

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

branch = develop 添加到您的配置中,就像这样。

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

Documentation 支持这个。

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

子模块的目标是获得特定版本,而不仅仅是"the latest"

如果最新版本在五分钟前更新为不兼容的版本,会发生什么情况?你的主模块不能使用那个版本。所以这不是子模块的作用。使用子模块时,您可以在超级项目中选择一个特定的提交。超级项目说,实际上:对于当前超级项目提交,使用子模块 lib/payment-sdk 的提交 XYZ。子模块 Git 按照超级项目 git (git submodule update).

的指示尽职尽责地检查该特定提交

设置子模块的分支不会改变上面的内容。更多关于分支名称的使用请参见脚注1。

现在,如果您在您的 存储库中工作,并且您注意到子模块有一个新的提交并且您想要测试 它,你可以很容易地做到这一点。只需输入子模块 — 毕竟它是一个单独的存储库 — 和 git checkout 您要测试的提交。1 当您在超级工程。如果一切顺利,然后,在超级项目中,你运行:

git add lib/payment-sdk

告诉超级项目,在您进行的下一次提交中,您希望超级项目命令子模块使用它现在正在使用的相同提交。

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

git commit

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


1您也可以使用 git submodule update --remote 稍微自动执行此操作,但细节会变得相当复杂。在大多数情况下,我个人更喜欢通过导航到子模块来直接控制每个子模块。如果你想要使用git submodule update --remotethis就是子模块的分支设置有意义的时候。

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

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

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

  • rebase:这意味着 将当前提交变基到另一个提交上。 用于变基的提交的哈希 ID 由分支名称。

在所有情况下,git submodule 将首先在子模块存储库中 运行 git fetch,除非您使用 --no-fetch-N 禁止它。 git fetch 操作是获取新提交并更新名称的操作,以便您之前设置的分支名称在 git fetch 之后采用新的哈希 ID 值。 请记住,是 git fetch 获得新的提交 并更新 remote-tracking 名称,如 origin/master。这个git fetch必须是子模块Git中的运行,而不是超级项目Git:它们毕竟是分开的,mostly-independent Git 个存储库。所以 all-in-one git submodule update --remote 操作就是这样做的:

  1. cd进入子模块;
  2. 运行 git fetch;
  3. 使用您之前设置的分支名称(作为子模块的 "branch" 设置)来计算哈希 ID,可能由 git fetch 更新在第 2 步中;
  4. 运行 一些第二 Git 操作——例如 git checkout——使用该哈希 ID。

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