是否可以与子模块同步检出主存储库的分支?

Posted

技术标签:

【中文标题】是否可以与子模块同步检出主存储库的分支?【英文标题】:Is it possible to checkout branches of main repository in sync with submodules? 【发布时间】:2017-05-04 00:38:01 【问题描述】:

我想要实现的是每当我在我的主存储库上使用 git checkout 时:

git checkout my-branch

我的子模块将跟随 my-branch 而不是分离的头。

有没有可能,如果有,怎么做?

【问题讨论】:

【参考方案1】:

如果这些子模块存储库有自己的 my-branch,它们可以是 declared to follow that branch

cd /path/to/your/parent/repo/Foo
git config -f .gitmodules submodule.bar1.branch my-branch
git config -f .gitmodules submodule.bar2.branch my-branch

git submodule update --remote

但这涉及到每次您在父 repo 中签出一个分支时都重复这一点。

torek 指出in the comments 这些子模块可能有自己的子模块,因此需要--recursive 选项。

您可能还想将--recursive 和/或--no-fetch 添加到您的git submodule update --remote 命令中。 您可能需要git submodule foreach,而不是单独的git config -f 操作,也可能需要--recursive

git submodule foreach -q --recursive 'git config -f $toplevel/.gitmodules submodule.$name.branch my_branch'

为了便于阅读,多行:

git submodule foreach -q --recursive \
  'git config -f $toplevel/.gitmodules submodule.$name.branch my_branch'

然后您可以将每个子模块签出到该分支:

git submodule foreach -q --recursive 'branch="$(git config -f $toplevel/.gitmodules submodule.$name.branch)"; git checkout $branch'

为了便于阅读,多行:

git submodule foreach -q --recursive \
  'branch="$(git config -f $toplevel/.gitmodules submodule.$name.branch)"; \
   git checkout $branch'

【讨论】:

您可能还想将--recursive 和/或--no-fetch 添加到您的git submodule update --remote 命令中。您可能需要git submodule foreach,而不是单独的git config -f 操作,也可能需要--recursive,尽管要做到这一点看起来很棘手。 我同意并且稍后会编辑(我正在通勤)我只是提出了一个解决方案的开始,提到了为子模块跟踪分支的可能性。 感谢您的回复。感谢您的帮助,但是我创建了一个脚本,子模块将遵循主存储库分支。 @GilroyToledano Nice:您的脚本在某处的要点中可用吗? (gist.github.com)

以上是关于是否可以与子模块同步检出主存储库的分支?的主要内容,如果未能解决你的问题,请参考以下文章

Git:在分支中创建子模块

通过ssh或https自动访问git子模块

Git分支是否可能与主分支存在于同一服务器上?

从 Azure DevOps 中的子模块触发父存储库中的构建

复杂的github结构

Git:将子模块文件检出到单个目录中