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”特殊条目)。不是文件夹。子模块commitsha new
位于远程;父项目是最新提交的(指子模块的sha new
);和git ls tree current parent branch
显示160000 commit new sha子模块
。我添加了一些关于子模块历史记录的详细信息。@me76好的,我在答案中包含了您的评论(以及我的注释)。子模块commitsha 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”),然后再次检查?我以不同的方式“解决”了它。我不得不做一些改变