如何将 git 子模块代码与主存储库代码一起推送

Chr*_*ris 5 git git-push git-submodules

我有一个存储库,其子模块位于 /modules 目录中。

我现在想强制推送整个仓库内容,包括。/modules 的内容到另一个存储库(用于部署)。

但是,当我在子模块中进行更改时,目标存储库的内容似乎没有更新。这是我运行来推送内容的:

 - git pull
 - git submodule update --init --recursive
 - git push -f --recurse-submodules=on-demand https://example.com/deployment.git master
Run Code Online (Sandbox Code Playgroud)

tor*_*rek 3

子模块只是 Git 存储库。

您可以用来在每个子模块中git submodule foreach运行任意命令。某些 Git 命令具有在每个子模块中运行特定(适当)命令的--recurse-submodules 选项。选项是这样的:它将进入已修改的子模块并在其他 Git 存储库中运行另一个命令。--recurse-submodules=on-demandgit pushgit push

子模块的git push似乎1具有以下形式:

git push <remote> <commit>:<branch>
Run Code Online (Sandbox Code Playgroud)

这要求子模块存储库签出一些分支名称。该名称显然必须与超级项目中的分支名称相匹配。然后它显示为:<branch>的一部分git push

如果子模块推送由于任何原因没有发生,则超级项目推送失败并且不会发生(被中止)。

我们无法从您的问题中得知(因为您没有包含任何这些命令的任何输出)推送是否完成或失败,以及如果失败,为什么会失败。但请注意,即使子模块推送本身完成,这也与其他任何情况一样git push:无法保证推送的目标会对收到的任何新提交执行任何操作。这取决于目标 Git 存储库。

你说:

但是,当我在子模块中进行更改时,目标存储库的内容似乎没有更新。这是我运行来推送内容的:

这里至少有两个目标:子模块存储库的远程目标和超级项目的远程目标。哪些没有更新?如果有的话,您遇到了什么错误?哪些部署策略对子模块的目标和超级项目的目标有效(如果有)?


1我做了一些简单的测试,发现了一些错误情况,例如,当子模块签出不同的分支名称时。