Git子模块停留在错误的提交上(“子模块更新”无效)

3

我有一个父项目和一个子模块(没有嵌套的子模块)。 子模块有一个新的提交(我们称之为new-sha),父级在远程仓库中引用该提交(当在Web浏览器中查看存储库时,可以看到submodule @ new-sha)。 我已经拉取了父项目,并且工作目录中也引用了正确的提交,如git show的输出所示:

--- a/submodule
--- b/submodule
@@ -1 +1 @@
-Subproject commit old-sha
+Subproject commit new-sha

即在父项目的最新提交中,将子模块更改为new-sha。然而,无论是git submodule update还是git pull --recurse-submodules都不会更新到子模块中的new-sha,它们总是检出old-sha

为什么会这样,如何解决?

git版本为2.21.0.windows.1

一些额外的信息:子模块本地有sha-new,但其HEAD停留在sha-old

sha-new立即由sha-old派生而来,以下是最后3次提交,或许这可以给出一些线索:

sha-new  == the top of submodule's branch used by parent project
sha-old  == HEAD
sha-xyz  == origin/HEAD

origin/HEAD 这一行让我有些担心。即使手动拉取了子模块(cd submodule; git pull origin branch-name:branch-name),origin/HEAD 仍停留在从顶部算起的第三个提交。


1
即使手动拉取了子模块,你能否执行 cd ..; git add submodule(没有尾随斜杠,将“submodule”替换为该子模块的根文件夹的名称),然后再次检查? - VonC
我用不同的方法“解决”了它。我必须对子模块进行一些更改,因此我手动切换到正确的提交,对子模块进行了更改并提交了更改,在父项目中提交了子模块。这最终更新了子模块的引用。 - me76
如果将来再次发生这种情况,我会尝试您的建议并在此处发表评论。谢谢! - me76
好的,根据您的评论,我已经编辑了答案,并附上了解释。 - VonC
所以,昨天又发生了这种情况。git submodule add 没有立即起作用,但后来我在这个讨论中发现,该人在索引中有(明显冲突的)子模块版本。 (git ls-files --stage | grep 160000)。将其从索引中删除 (git rm --cached) 并使用 git submodule add 重新添加后,我终于能够从父项目更新子模块了。 - me76
1个回答

0

您需要确保新提交已推送到子模块远程仓库(在.gitmodules URL line中列出的那个)。

然后,您需要在主父仓库本地克隆中执行git status,以检查它是否处于master分支的最新状态,并且git ls-tree显示正确的子模块根树提交


OP me76 在评论中添加了一些内容:

我用了一个不同的“解决”方案。
我必须对子模块进行一些更改,所以我手动切换到正确的提交版本,在子模块中进行更改和提交,并在父项目中提交子模块。
这最终更新了子模块的引用。

因为这样做会强制主要仓库更新gitlink(索引中的特殊条目),以引用子模块的新提交主目录树。
推送后将发布该新的 gitlink 提交。


OP还提到了this thread:

此人在索引中有一个(显然有冲突的)子模块版本(git ls-files --stage | grep 160000)。

从索引中删除它(git rm --cached),然后使用git submodule add重新添加它,最终我才能够从父项目更新子模块。

注意:git rm --cached asubmoduleFolder不能以 '/' 结尾:您正在删除一个gitlink(即索引中的 '160000' 特殊条目)。而不是文件夹。


1
子模块提交的 sha-new 已经在远程;父项目位于最新提交(指子模块的 sha-new);并且 git ls-tree current-parent-branch 显示 160000 commit new-sha submodule - me76
我已经添加了有关子模块历史的一些细节。 - me76
@me76 好的,我已经将你的评论(附有我的注释)包含在答案中。 - VonC

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