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

时间:2016-03-01 14:43:13

标签: git git-submodules git-tag

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

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

这可能吗?

2 个答案:

答案 0 :(得分:1)

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

Git子模块的原理是将子模块的特定提交SHA值存储在主存储库的任何状态中。说过以下命令应该是必要的:

让我们去一个分支说MainProj的V1.0:

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

让我们找到对应于V1.3的SubProj提交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,那么在子模块的初始化/更新时,它将转到SubProj#V1.3,而不是子模块或SubProj的最新状态。

答案 1 :(得分:0)

当然可以做到这一点,但是使用 one命令完成类型的解决方案无法做到这一点。你必须

  1. 要么必须发布供用户使用的工作流程,
  2. 将用户的别名发布到其各自的存储库或
  3. 编写一个git post-checkout钩子,您的用户必须将其下载并添加到其存储库中的.git/hooks目录中,以处理所有这些。
  4. 不幸的是,我现在想不出任何更简单的解决方案。