有没有办法在项目标签中包含特定版本的 Git 子模块?

Is there a way to include a particular version of a Git submodule in a project tag?

我有一个项目 SubProj,我想将其作为子模块包含在 MainProj 中。但是,我想确保我对 MainProj 所做的任何发布也包含特定版本的 SubProj 以确保满足所有依赖项。

换句话说,当我将 MainProj 的特定提交标记为新版本 V1.0 时,我还想包括例如SubProj V1.3,因此每当有人签出 MainProj 1.0 时,子模块将始终初始化为 V1.3,而不是 SubProj HEAD 中当时指向的任何提交。

这可能吗?

当然这可以做到,但这不能用一个命令完成-完成种解决方案。你将不得不

  1. 要么必须发布工作流供您的用户执行,
  2. 为您的用户发布一个别名,一旦添加到他们各自的存储库中,或者,
  3. 编写一个 git post-checkout 挂钩,您的用户必须下载该挂钩并将其添加到他们的存储库中的 .git/hooks 目录中,以处理所有这些。

很遗憾,我现在想不出更简单的解决方案。

您只需更新 MainProj#V1.0 以使用 SubProj#V1.3 的 SHA

Git 子模块的理念是针对主存储库的任何状态存储子模块的特定提交 SHA 值。话虽如此,以下命令应该可以做到:

让我们转到 MainProj 的 V1.0 分支:

$ cd main-repo-directory
$ git checkout V1.0

让我们找到V1.3对应的SubProj commit id

$ cd <sub-module-directory>
$ git log # Pick the commit SHA id corresponding to V1.3, say <sub-prev-commit-sha>
$ git reset --hard <sub-prev-commit-sha>

现在,只需更新 MainProj#V1.0 以引用 SubProj#V1.3

$ cd main-repo-directory
$ git add <sub-module-directory>
$ git commit -m 'Tagging SubProj#V1.3 to MainProj#V1.0'
$ git push

现在,如果有人签出 MainProj#V1.0,那么在子模块的 init/update 上,它将到达 SubProj#V1.3,而不是子模块或 SubProj 的最新状态。