如何在删除后恢复Git子模块?

7
我不小心删除了一个子模块目录/仓库。在执行git submodule init后,我尝试运行git submodule update,但是出现以下错误信息:

fatal: Not a git repository: ../../.git/modules/externals/foo

Unable to find current revision in submodule path 'externals/foo'

请问我做错了什么?
编辑:我删除了子模块目录,我可以克隆存储在.gitmodules中的子模块仓库,但是我在某个地方读到可以通过删除.git/modules/externals文件夹来完全删除子模块(我不知道这是否正确)。无论如何,我下载了仓库并将其粘贴到应存在子模块的位置,但这不是正确的方法。执行git submodule命令会输出以下内容:

+244d6addc83d1cc801ff1880f71574d3fcc6b77e externals/foo (heads/master)


问题不清楚。你删除了哪一个?子模块目录在工作区中。你可以通过git update来恢复它。错误信息看起来不仅仅是一个已删除的子模块目录。子模块存储库(对象存储)位于顶级存储库的.git/modules/...下。如果你删除了它,你需要有另一个存储库,git submodule update可以再次克隆,否则它就会丢失。在主存储库中:.gitmodules文件包含什么?git submodule说了什么?git diff说了什么?在回答这个问题之前,你需要提供更多的细节。 - Uwe Geuder
所以你首先删除了子模块目录,然后甚至删除了子模块仓库(对象存储库)。下载和粘贴数据永远不应该是必要的,可能出了些问题。那么1)子模块去初始化 2)删除所有已粘贴的数据 3)git子模块初始化 4)git子模块更新怎么样? - Uwe Geuder
当我运行 git submodule deinit foo 时,出现了 error: pathspec 'deinit' did not match any file(s) known to git 的错误。 - DarthSpeedious
我也收到了 Did you forget to 'git add'? 的提示信息。 - DarthSpeedious
我测试了删除子模块目录和子模块仓库(主仓库下的.git/modules对象存储)。仍然可以通过git submodule update恢复两者(假设子模块仍然可以从原始位置克隆)。建议使用deinit只是因为您的状态似乎更不一致。对我来说,deinit命令有效,您需要提供子模块的完整本地路径(错误的路径将导致您引用的消息)。根据原始问题中的错误消息,该路径应为externals/foo。 - Uwe Geuder
git submodule update externals/foo 现在似乎可以工作了,非常感谢! - DarthSpeedious
1个回答

6

我使用 @UweGeuder 的注释恢复了我的工作副本:

git submodule deinit -f .
git submodule update --init

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