【发布时间】:2019-10-15 17:09:44
【问题描述】:
我有一个带有子模块(没有嵌套子模块)的父项目。子模块有一个新的提交(我们称它为new-sha),父模块在远程仓库中引用该提交(在网络浏览器中查看仓库时我可以看到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 仍处于顶部的第三次提交。
【问题讨论】:
-
即使在手动拉取子模块后:你能做一个
cd ..; git add submodule(没有斜杠,用该子模块的根文件夹的名称替换'submodule'),然后再次检查?跨度> -
我以不同的方式“解决”了它。我不得不在子模块中做一些更改,所以我手动切换到正确的提交,在子模块中做了并提交了更改,并在父项目中提交了子模块。这终于更新了对子模块的引用。
-
如果以后再发生这种情况,我会尝试你的建议并在这里发表评论。谢谢!
-
好的,我已经根据您的评论编辑了答案,并附上了解释。
-
所以,昨天又发生了。 git submodule add 没有立即工作,但后来我发现this discussion 人在索引中有(显然冲突的)子模块版本(git ls-files --stage | grep 160000)。从索引 (git rm --cached) 中删除它并使用 git submodule add 重新添加后,我终于能够从父项目更新子模块。跨度>
标签: git git-submodules