不同的git子模块指向同一存储库中的不同标记/分支

时间:2014-05-22 17:41:41

标签: git github git-submodules

场景是我有一个git项目A,它有一个指向项目B repo的子模块,即指向这种repo的特定标签。我想在A中创建一个可以指向与B不同的标签的分支。 问题:有可能吗?如果有,怎么样?如果不是,我想听听你关于更好的项目结构的建议。 提前谢谢。

编辑:无需再次克隆回购B.

1 个答案:

答案 0 :(得分:1)

简而言之:是的!这绝对是可能的,但首先要做一点澄清。

git如何存储对子模块的引用

git子模块(在您的示例中为项目B)总是由主git项目(A)通过指定提交(其SHA-1哈希)来引用。 您指向的提交也可能对应于标记(或分支头),请记住git存储引用的哈希。因此,如果您(出于任何原因)删除项目B中的标记甚至移动它,项目A将继续引用初始提交。

在主项目中创建一个指向子模块中不同提交的分支

让我们假设:主分支(master)中的项目A在某个标记(tagB1)处引用项目B.因此,您已将其作为子模块进行链接,并将其存储到projB文件夹

  1. 在项目A中创建分支并像往常一样切换到它。

      

    git checkout -b NewBranch

  2. 更改为子模块(projB)目录

      

    cd projB

  3. 根据需要将子模块切换(签出)到新的提交或标记

      

    git checkout tagB2

  4. 返回项目主文件夹并提交。这将项目A(在分支NewBranch中)与您选择的标记之间的链接存储(实际上存储了哈希的提交,如所解释的那样)

  5. 在主项目分支和子模块之间切换

    重要的是要记住:如果切换主项目分支,子模块将不会自动跟随主分支!! 在我们的示例中,如果您将项目A切换回master分支,项目B将保留为版本tagB2而不是tagB1,您可能会认为...

    您需要运行命令git submodule update

    有关详细信息,请查看ProGit chapter about submodules