使用git子模块创建多个远程分支

mspsb9vt  于 2023-01-28  发布在  Git
关注(0)|答案(2)|浏览(158)

我是第一次使用git子模块,正在努力理解如何全面创建分支,并将它们添加到所有远程repos中。
当前我的文件结构类似于以下内容:

-parent_repo
  |
  |_ submodule_1
  |_ submodule_2
  |_ submodule_3
  |_ submodule_4
  |_ submodule_5
  |_ submodule_6
  |_ submodule_7

如果我在父存储库上创建一个分支:

(master) $ git checkout -b feature/my_feature
(feature/my_feature) $ git commit -m "created my_feature"
(feature/my_feature) $ git push -u origin feature/my_feature

我想创建一个分支跨越所有的子模块,包括父模块。之后所有的分支被推到远程每个子模块和他们尊重的repos。
已尝试以下步骤:

$ git submodule foreach -b branch_name
$ git push --recurse-submodules=on-demand
$ git submodule foreach "(git checkout branch_name; git pull)&"

..失败。找不到第一个命令。
...如果我做了...

$ git config -f .gitmodules submodule.submodule_1.branch branch_name
$ git submodule update --remote

git返回:

fatal: Needed a single revision
Unable to find current origin/branch_name revision in submodule path 'submodule_1'
rxztt3cl

rxztt3cl1#

参见子模块提示:
例如,假设我们想要启动一个新特性或修复一个bug,我们需要在几个子模块中进行工作。
我们可以很容易地将所有工作隐藏在所有子模块中:

$ git submodule foreach 'git stash'
Entering 'CryptoLibrary'
No local changes to save
Entering 'DbConnector'
Saved working directory and index state WIP on stable: 82d2ad3 Merge from origin/stable
HEAD is now at 82d2ad3 Merge from origin/stable

然后我们可以创建一个新的分支,并在所有子模块中切换到它:

$ git submodule foreach 'git checkout -b featureA'
Entering 'CryptoLibrary'
Switched to a new branch 'featureA'
Entering 'DbConnector'
Switched to a new branch 'featureA'

然后,您仍然需要在父存储库中创建相同的分支、add、commit和push,因为所有子模块存储库都将发生更改。
但请记住:它们是不同的分支(即使它们具有相同的名称),每个分支特定于它自己的存储库(父存储库或子模块存储库)。

h22fl7wq

h22fl7wq2#

我想在所有子模块(包括父模块)之间创建一个分支
Git 2.36(Q2 2022)将正式支持这一功能(起初是实验模式)。
"git branch"(man)已学习--recurse-submodules选项。
参见Junio C Hamano ( gitster )commit 09e0be1(2022年1月31日)。
参见commit 679e369commit 961b130commit 6e0a2cacommit 3f3e760commit bc0893ccommit e89f151(2022年1月28日),作者为Glen Choo ( chooglen )
(由Junio C Hamano -- gitster --合并至commit 5cc9522,2022年2月18日)

branch:添加用于分支创建的--recurse-submodules选项

协助人:乔纳森·谭
签署人:朱格兰
审核人:陈宗泽
为了改进子模块UX,我们想教Git如何处理子模块中的分支。
开始此过程时,先教"git branch"(man--recurse-submodules选项,以便git branch --recurse-submodules(man)主题在超级项目及其子模块中创建topic分支。
虽然此提交不会引入破坏性更改,但它不能很好地与现有--recurse-submodules命令一起工作,因为git branch --recurse-submodules "写入子模块引用存储,但大多数命令只考虑超级项目gitlink并 * 忽略 * 子模块引用存储。
例如,"git checkout --recurse-submodules"(man)将 checkout 超级项目gitlinks中的提交(并将子模块放在分离的HEAD中),而不是 checkout 子模块分支。
因此,此提交引入了一个新的配置值submodule.propagateBranches
如果此值为true,Git命令将子模块ref存储信息的优先级设置为高于超级项目gitlinks
因为"git branch --recurse-submodules"写入子模块ref存储,为了清楚起见,除非设置此配置值,否则它将不起作用。
此提交还包括支持从超级项目提交处理子模块的更改,因为"branch --recurse-submodules"(以及未来的命令)需要从超级项目提交读取.gitmodulesgitlinks,但子模块通常从文件系统的.gitmodules和索引的gitlinks读取。
这些变化是:

  • 添加一个submodules_of_tree()帮助器,它给出了树内子模块的相关信息(例如path和oid),并初始化存储库
  • 通过将treeish_name参数添加到is_submodule_active()来添加is_tree_submodule_active()
  • 添加"submoduleNotUpdated"建议,建议用户更新树中的子模块

顺便说一句,修复了一个错误的用法字符串,该字符串将git branch(-l)的"list"用法与"create"用法组合在一起;这个字符串从一开始就不正确,a8dfd5e("使用parse_options创建builtin-branch.c.",2007年10月7日,Git v1.5.4-rc0--merge)。
git config现在在其手册页中包括:

submodulesNotUpdated

当用户运行因git submodule update --init未运行而失败的子模块命令时显示的建议。
git config现在在其手册页中包括:

submodule.recurse

一个布尔值,指示命令是否应默认启用--recurse-submodules选项。
默认为false。
当设置为true时,可以通过--no-recurse-submodules选项来关闭它,注意一些没有这个选项的Git命令可能会调用上面一些受submodule.recurse影响的命令;例如,git remote update将调用git fetch,但没有--no-recurse-submodules选项。对于这些命令,解决方法是使用git -c submodule.recurse=0临时更改配置值。
以下列表显示接受--recurse-submodules的命令以及此设置是否支持这些命令。

  • 始终支持checkoutfetchgreppullpushread-treeresetrestoreswitch
  • 不支持clonels-files
  • 仅当启用submodule.propagateBranches时才支持branch

submodule.propagateBranches

[实验]一个布尔值,在使用--recurse-submodulessubmodule.recurse=true时启用分支支持。启用该值将允许某些命令接受--recurse-submodules,并且某些已经接受--recurse-submodules的命令现在将考虑分支。
git branch现在在其手册页中包括:
'git branch' [--track[=(direct|inherit)] | --no-track] [-f]
[--recurse-submodules] <branchname> [<start-point>]
git branch现在在其手册页中包括:

--recurse-submodules

此选项是实验性的!如果启用了submodule.propagateBranches,则导致当前命令递归到子模块中。请参阅git config中的submodule.propagateBranches
当前仅支持分支创建。
在分支创建中使用时,将在超级项目中创建一个新分支<branchname>,并在超级项目的所有子模块中创建。
在子模块中,分支将指向超级项目<start-point>中的子模块提交,但分支的跟踪信息将基于子模块的分支和远程设置,例如git branch --recurse-submodules topic origin/main将创建子模块分支"topic",该分支指向超级项目"origin/main"中的子模块提交。但是跟踪子模块的"origin/main"。
在Git 2.40(Q1 2023)中,改进了当"git branch --recurse-submodules"(man)失败时给出的建议消息。
参见commit 97cf0c7(2023年1月16日),作者为Philippe Blain ( phil-blain )
(由Junio C Hamano -- gitster --合并至commit 7d4d34f,2023年1月27日)

branch:- -recurse-submodule失败时改进建议

签署人:菲利普·布莱恩
审核人:朱格兰
如果尚未克隆"from-here"中存在的任何子模块(在submodule. propagateBranches = true下),则"git branch --recurse-submodules"(man)start from-here失败。
于是我们给出这样的建议:
x1米80英寸

如果设置了“submodule.recurse”,则“git checkout”(man)from-here也将失败,因为它将尝试递归地检出子模块。
通过将“--no-recurse-submodules”添加到checkout命令来改进建议。
You may try updating the submodules using 'git checkout --no-recurse-submodules %s && git submodule update --init

相关问题