场景是我有一个git项目A,它有一个指向项目B repo的子模块,即指向这种repo的特定标签。我想在A中创建一个可以指向与B不同的标签的分支。 问题:有可能吗?如果有,怎么样?如果不是,我想听听你关于更好的项目结构的建议。 提前谢谢。
编辑:无需再次克隆回购B.
答案 0 :(得分:1)
简而言之:是的!这绝对是可能的,但首先要做一点澄清。
git如何存储对子模块的引用
git子模块(在您的示例中为项目B)总是由主git项目(A)通过指定提交(其SHA-1哈希)来引用。 您指向的提交也可能对应于标记(或分支头),请记住git存储引用的哈希。因此,如果您(出于任何原因)删除项目B中的标记甚至移动它,项目A将继续引用初始提交。
在主项目中创建一个指向子模块中不同提交的分支
让我们假设:主分支(master
)中的项目A在某个标记(tagB1
)处引用项目B.因此,您已将其作为子模块进行链接,并将其存储到projB
文件夹
在项目A中创建分支并像往常一样切换到它。
git checkout -b NewBranch
更改为子模块(projB
)目录
cd projB
根据需要将子模块切换(签出)到新的提交或标记
git checkout tagB2
返回项目主文件夹并提交。这将项目A(在分支NewBranch
中)与您选择的标记之间的链接存储(实际上存储了哈希的提交,如所解释的那样)
在主项目分支和子模块之间切换
重要的是要记住:如果切换主项目分支,子模块将不会自动跟随主分支!!
在我们的示例中,如果您将项目A切换回master
分支,项目B将保留为版本tagB2
而不是tagB1
,您可能会认为...
您需要运行命令git submodule update
有关详细信息,请查看ProGit chapter about submodules