【问题标题】:How to use `git submodules` to track a superproject by branching如何使用`git submodules`通过分支跟踪超级项目
【发布时间】:2024-01-03 04:33:01
【问题描述】:

我有一个超级项目,我在其中添加了许多项目作为子模块。这些项目是微服务架构的一部分。 使用带有(微服务)项目作为子模块添加的超级项目的想法是能够在单个存储库中获取所有项目。

另一个用例是跟踪所有项目的变化。 想法是对超级项目进行分支,这样每个分支都会在给定时间创建所有项目的“快照”。

但是,我发现每当我创建一个新分支并更新子模块 (git submodules update --remote) 时,超级项目的所有分支都会更新。这是意料之中的,因为子模块只是原始项目的链接。

现在我的问题是,我有没有为超级项目拍摄快照的策略?我们可以分支单个项目的方式,对于子模块超级项目有这样的方式吗?

谢谢。

【问题讨论】:

  • "每当我创建一个新分支并更新子模块 (git submodules update --remote) 时,超级项目的所有分支都会更新。这是意料之中的“当然不会。 AFAIU 在超级项目上切换分支时,您不会使用git submodule update 将子模块与超级项目的当前状态同步;你应该。我在post-checkout 钩子里做。在最近的 Git 中,可以配置为自动执行此操作。或使用git checkout --recurse-submodules 更改分支。
  • 谢谢@phd 不幸的是,这似乎不起作用。我没有对超级项目中的子模块进行任何更改。我将超级项目用作存储库的集合,并且我想使用超级项目的分支作为所有项目在特定时间提交的快照。每当我在超级项目中创建一个新分支并执行submodule update --remotesubmodule foreach git pull 时,它会将所有以前的超级项目分支更新为子模块的最新提交。
  • 我尝试创建orphan 分支并将分支设置为--unset-upstream,但超级项目分支仍在不断更新。
  • git submodule update without --remote or git checkout --recurse-submodules 更新子模块到超级项目中记住的提交。

标签: git git-branch git-submodules


【解决方案1】:

我相信在创建该超级项目时,您将子模块设置为使用以下内容跟踪分支

git submodule add -b <yourBranch> <URL>

这就是git submodule update --remote 更新每个子模块的原因。 所以你可能需要git submodule tracking latest的倒数。

一种方法是开始清理,删除子模块,然后重新添加而不使用-b 说明符。

要拍摄快照,请在超级项目中创建一个新分支,删除子模块,然后重新添加,不要使用 -b 说明符。

创建新分支

git checkout -b <branch-name>

来自how to remove a submodule的步骤:

1. git submodule deinit -f -- a/submodule    
2. rm -rf .git/modules/a/submodule
3. git rm -f a/submodule

然后在没有分支跟踪信息的情况下再次添加

git submodule add <URL>

添加后,有机会检出子模块中的特定提交,因此将像快照一样跟踪

1. cd submodule
2. git checkout <commit hash>
3. cd ..

4. git add --all    # or after every submodule
5. git commit -m "Tracking revision xx"

6. git push

每次子模块更新后,第 4 步和第 5 步不是必需的,只是推荐。

【讨论】: