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 --remote
,this就是子模块的分支设置有意义的时候。
此时,您现在必须选择三种特定模式之一:
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
操作就是这样做的:
cd
进入子模块;
- 运行
git fetch
;
- 使用您之前设置的分支名称(作为子模块的 "branch" 设置)来计算哈希 ID,可能由
git fetch
更新在第 2 步中;
- 运行 一些第二 Git 操作——例如
git checkout
——使用该哈希 ID。
手动执行此操作 - 这样您就可以控制结果,而不是仅仅假设某些计算机程序已经产生了正确的答案(即 42),即使您不确定 问题 是——你会做这些相同的步骤,但在继续下一个步骤之前可能实际上会看看每个步骤做了什么。
在我的项目回购中,我创建了一个子模块,在 .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 --remote
,this就是子模块的分支设置有意义的时候。
此时,您现在必须选择三种特定模式之一:
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
操作就是这样做的:
cd
进入子模块;- 运行
git fetch
; - 使用您之前设置的分支名称(作为子模块的 "branch" 设置)来计算哈希 ID,可能由
git fetch
更新在第 2 步中; - 运行 一些第二 Git 操作——例如
git checkout
——使用该哈希 ID。
手动执行此操作 - 这样您就可以控制结果,而不是仅仅假设某些计算机程序已经产生了正确的答案(即 42),即使您不确定 问题 是——你会做这些相同的步骤,但在继续下一个步骤之前可能实际上会看看每个步骤做了什么。