git子模块在错误提交时卡住(';子模块更新';不工作)

git子模块在错误提交时卡住(';子模块更新';不工作),git,git-submodules,Git,Git Submodules,我有一个带有子模块的父项目(没有嵌套的子模块)。子模块有一个新提交(我们称之为new sha),父模块在远程repo中引用该提交(在web浏览器中查看repo时,我可以看到submodule@new sha)。 我已经提取了父项目,它还引用了工作目录中的正确提交,如git showoutput所示: --- a/submodule --- b/submodule @@ -1 +1 @@ -Subproject commit old-sha +Subproject commit new-sha

我有一个带有子模块的父项目(没有嵌套的子模块)。子模块有一个新提交(我们称之为
new sha
),父模块在远程repo中引用该提交(在web浏览器中查看repo时,我可以看到
submodule@new sha
)。 我已经提取了父项目,它还引用了工作目录中的正确提交,如
git show
output所示:

--- a/submodule
--- b/submodule
@@ -1 +1 @@
-Subproject commit old-sha
+Subproject commit new-sha
即,父项目中的最新提交已将子模块更改为
新sha
。但是,无论是
git子模块更新
还是
git-pull——都不会将子模块
更新到子模块中的
新sha
,它们总是签出
旧sha

为什么,以及如何修复它

git版本2.21.0.windows.1

一些附加信息:子模块在本地具有
sha new
,但其头部卡在
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
仍停留在从顶部开始的第三次提交状态。

您需要确保新提交被推送到子模块远程存储库。(列表中列出的一个)

然后,您需要在主父repo本地克隆中执行git状态,以检查它是否是
master
分支的最新版本


报告补充说:

我以不同的方式“解决”了它。
我必须在子模块中进行一些更改,因此我手动切换到正确的提交,在子模块中进行更改并提交,然后在父项目中提交子模块。
这最终更新了对子模块的引用

这是因为这样做会迫使主存储库更新引用子模块主文件夹树的新提交。
推送将发布新的gitlink提交


OP还提到:

此人在索引中有子模块的版本(显然有冲突)(
gitls文件--stage | grep 160000

在从索引(
gitrm--cached
)中删除它并用
gitsubmoduleadd
重新添加它之后,我终于能够从父项目中更新子模块


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

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

然后,您需要在主父repo本地克隆中执行git状态,以检查它是否是
master
分支的最新版本


报告补充说:

我以不同的方式“解决”了它。
我必须在子模块中进行一些更改,因此我手动切换到正确的提交,在子模块中进行更改并提交,然后在父项目中提交子模块。
这最终更新了对子模块的引用

这是因为这样做会迫使主存储库更新引用子模块主文件夹树的新提交。
推送将发布新的gitlink提交


OP还提到:

此人在索引中有子模块的版本(显然有冲突)(
gitls文件--stage | grep 160000

在从索引(
gitrm--cached
)中删除它并用
gitsubmoduleadd
重新添加它之后,我终于能够从父项目中更新子模块


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

子模块commit
sha new
位于远程;父项目是最新提交的(指子模块的
sha new
);和
git ls tree current parent branch
显示
160000 commit new sha子模块
。我添加了一些关于子模块历史记录的详细信息。@me76好的,我在答案中包含了您的评论(以及我的注释)。子模块commit
sha new
位于远程位置;父项目是最新提交的(指子模块的
sha new
);和
git ls tree current parent branch
显示
160000 commit new sha submodule
。我已经添加了一些关于子模块历史记录的详细信息。@me76好的,我已经在答案中包含了您的评论(以及我的注释)。即使在手动拉取子模块之后:您能做
cd。。;git add submodule
(无尾随斜杠,用该子模块根文件夹的名称替换“submodule”),然后再次检查?我以不同的方式“解决”了它。我必须在子模块中进行一些更改,所以我手动切换到正确的提交,在子模块中进行更改并提交,然后在父项目中提交子模块。这最终更新了对子模块的引用。如果以后再次发生这种情况,我将尝试您的建议,并在这里发表评论。谢谢好的,我已经根据你的评论编辑了答案,并做了解释。所以,昨天又发生了。git子模块add并没有立即起作用,但后来我发现此人在索引中的子模块版本(git ls文件——stage | grep 160000)在哪里(显然存在冲突)。在从索引(git rm--cached)中删除它并用git submodule add重新添加它之后,我终于能够从父项目中更新子模块。。;git add submodule(无尾随斜杠,用该子模块根文件夹的名称替换“submodule”),然后再次检查?我以不同的方式“解决”了它。我不得不做一些改变