在主项目中,是否可能将Git子模块连接到分支上的特定提交?

5
我使用的是 git version 2.8.0.windows.1 版本。
主项目有一个名为 "release" 的分支,每次发布新版本时我都会在这里推送更新。
该项目还有一个子模块,正在并行开发中,所以我预计会有许多提交。
主项目的 Master 分支和子模块的 Master 分支几乎是并行的。 Master Commit 1 => Master Commit 2 => Master Commit 3 => Master Commit 4
Submodule Commit 1 => Submodule Commit 2 => Submodule Commit 3 => Submodule Commit 4
在这种情况下,Master Commit 4Submodule Commit 4 是对齐的。
问题出现在某人试图太晚获取发布分支时。
如果我在 Master Commit 1 推送了 release 分支,并且当我们处于 Master Commit 4 时某人拉取了发布分支,那么就会有不对齐的情况(因为发布Master Commit 1 相关,而现在我们在Submodule Commit 4)。
我想到的解决方案是以某种方式强制将Submodule Commit 1 放到 release 分支上,但我还不知道如何实现。
我知道一个很好的解决方案就是像这里所讲的那样在子模块中添加分支或标签。
但是我对子模块库没有权限,所以很难为我设置分支或标签。
有没有什么方法可以强制在我的发布分支上使用特定的子模块提交,而不仅仅是子模块分支/标签?
1个回答

6

无论如何,这就是子模块的工作方式,所以我不明白你的问题。让我试着改进或修复你的工作流程。你需要确保release分支中的每个提交都指向子模块中相应的提交,对吗?很简单:在release分支进行提交之前,更新子模块,在子模块中检出正确的提交,并在超级项目中提交更改:

# In the superproject
git checkout release

cd subdir # into the submodule
git checkout master # reconcile detached HEAD
git pull origin master # update the submodule
git checkout some-sha1 # if you don't want the latest commit in master

cd .. # back into superproject
git add subdir
git commit -m "Update submodule"

现在,每个使用git clone --recursive命令克隆超级项目的人都会得到子模块指向release分支中每个提交所对应的正确提交。

1
如果我需要在我的机器上进行操作而不重新克隆怎么办?我尝试了 git checkout release git pull origin release,但它没有将子模块恢复到发布版本(我仍然有主分支的子模块)。我也尝试了 git submodule sync,但没有成功。 - Jack Mariani
1
git pull --recurse-submodulesgit submodule update - phd

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接