恢复已删除的子模块

11

假设我有一个子模块dir1/dir2(通过下面的步骤创建)。在删除dir2后,如何恢复子模块?git submodule update提示子模块不存在,git reset HEAD --hard可以恢复dir2但无法恢复其内容。我是按照以下方式创建子模块的:

mkdir dir1
cd dir1/
mkdir dir2

cd dir2/
touch 1.txt
git init
git add 1.txt
git commit -m "test"

cd ..
git init
git submodule add ./dir2/
git commit -m "adding submodule"

rm -r dir2
**** Now how do I restore dir2 and its contents? ****

1
git submodule update --init 不起作用? - VonC
1
@VonC:不,我收到了一个“致命错误:存储库'dir1/dir2'不存在”的错误消息。 - artella
如果在“git submodule update --init”之前运行“mkdir dir1/dir2”呢?另外,您使用的是Git的哪个版本? - VonC
1
那相当于删除一个本地仓库... 除了尝试一些未擦除程序来查看文件系统是否以某种方式保留了已删除的文件的痕迹之外,没有太多事情要做。 - VonC
1
如果你只有一个.gitmodules文件并且已经删除了子模块仓库,请尝试使用此脚本:https://gist.github.com/aroemen/5027030 - Maxime R.
显示剩余6条评论
4个回答

6

如果您还没有提交更改(至少),可以尝试此方法。这对我有效。

git restore path-to-your/submodule-name --recurse-submodules

我认为恢复无法工作的原因是它有子模块,这个方法解决了这个问题。

但更重要的是,我可以还原对子模块所做的不需要的更改(一堆二进制文件导致警告)。


运行git命令时,当前工作目录必须存在一个git仓库。例如,如果我的文件夹~/home/myrepo有一个git仓库,我需要将当前工作目录移动到那个文件夹中,然后运行git status命令。如果你从不包含git仓库的文件夹中运行git status(或任何其他git命令),Git会返回这个确切的消息。 - Karmavil
也许你在“submodules”或“dependencies”文件夹中下载并解压了一个zip或rar文件。这可能是你的子模块中没有git仓库的原因。 - Karmavil

4
dir2 中初始化 git 仓库(cd dir2; git init)并不会使 dir2 成为子模块。
这只是让 dir2 成为一个嵌套的仓库,任何父级仓库都会忽略它。
删除 dir2 意味着您无法直接获取其内容。
您可以使用 git submodule add /another/path/dir2,将 dir2 作为位于 dir1 之外的仓库添加进来。
然后就可以恢复 dir2 了。

4
只是补充一下,对于你上面提到的设置,原始命令 git submodule update --init 会恢复 dir2 - artella

3
尝试通过以下两个命令“deinit”和“init”所有子模块:
git submodule deinit -f .
git submodule update --init

在删除子模块文件以恢复它们后,尝试此操作。 - jegadeesh
这对我有效,谢谢。 - Syed Faizan Ahmed

-1
如果您未提交删除操作,您可以只提交其他所有本地更改,然后执行。
git reset --hard

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