【问题标题】:A git submodule is stuck at wrong commit ('submodule update' doesn't work)一个 git 子模块卡在错误的提交上(“子模块更新”不起作用)
【发布时间】: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 updategit 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


【解决方案1】:

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

然后你需要在你的主父 repo 本地克隆中做一个 git status 来检查它是否最晚是 master 分支和 git ls-tree does show the right submodule root tree commit


OP me76 加上in the comments

我以不同的方式“解决”了它。
我不得不在子模块中做一些更改,所以我手动切换到正确的提交,在子模块中完成并提交了更改,并在父项目中提交了子模块。
这终于更新了对子模块的引用。

这是因为这样做会强制主存储库更新 gitlink (special entry in the index) 以引用子模块主文件夹树的新提交。
推送将发布新的 gitlink 提交。


OP也指this thread

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

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

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

【讨论】:

  • 子模块提交sha-new在远程;父项目在最新提交(指子模块的sha-new);和git ls-tree current-parent-branch 显示160000 commit new-sha submodule
  • 我添加了一些关于子模块历史的细节。
  • @me76 好的,我已将您的评论(以及我的注释​​)包含在答案中。
猜你喜欢
  • 2014-08-29
  • 2015-10-20
  • 2012-06-06
  • 2011-08-15
  • 2013-01-03
  • 1970-01-01
  • 2021-10-15
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多