我是第一次使用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'
2条答案
按热度按时间rxztt3cl1#
参见子模块提示:
例如,假设我们想要启动一个新特性或修复一个bug,我们需要在几个子模块中进行工作。
我们可以很容易地将所有工作隐藏在所有子模块中:
然后我们可以创建一个新的分支,并在所有子模块中切换到它:
然后,您仍然需要在父存储库中创建相同的分支、add、commit和push,因为所有子模块存储库都将发生更改。
但请记住:它们是不同的分支(即使它们具有相同的名称),每个分支特定于它自己的存储库(父存储库或子模块存储库)。
h22fl7wq2#
我想在所有子模块(包括父模块)之间创建一个分支
Git 2.36(Q2 2022)将正式支持这一功能(起初是实验模式)。
"
git branch
"(man)已学习--recurse-submodules
选项。参见Junio C Hamano (
gitster
)的commit 09e0be1(2022年1月31日)。参见commit 679e369、commit 961b130、commit 6e0a2ca、commit 3f3e760、commit bc0893c、commit 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
"(以及未来的命令)需要从超级项目提交读取.gitmodules
和gitlinks
,但子模块通常从文件系统的.gitmodules
和索引的gitlinks读取。这些变化是:
submodules_of_tree()
帮助器,它给出了树内子模块的相关信息(例如path和oid),并初始化存储库treeish_name
参数添加到is_submodule_active()
来添加is_tree_submodule_active()
顺便说一句,修复了一个错误的用法字符串,该字符串将
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
的命令以及此设置是否支持这些命令。checkout
、fetch
、grep
、pull
、push
、read-tree
、reset
、restore
和switch
。clone
和ls-files
。submodule.propagateBranches
时才支持branch
submodule.propagateBranches
[实验]一个布尔值,在使用
--recurse-submodules
或submodule.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