恢复已删除的子模块

Restoring deleted submodules

提问人:artella 提问时间:1/3/2015 更新时间:2/19/2022 访问量:11337

问:

假设我有一个子模块(通过下面显示的步骤创建)。删除子模块后如何恢复?dir1/dir2dir2

git submodule update抱怨子模块不存在,并恢复但不恢复其内容。我通过以下方式创建子模块:git reset HEAD --harddir2

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? ****
git git 子模块

评论

1赞 VonC 1/3/2015
git submodule update --init不行吗?
1赞 artella 1/3/2015
@VonC : 否,我收到错误消息fatal: repository 'dir1/dir2' does not exist
0赞 VonC 1/3/2015
如果你在 ?另外,您使用的是哪个版本的 Git?mkdir dir1/dir2git submodule update --init
1赞 VonC 1/3/2015
那么它就相当于删除一个本地存储库......除了尝试一些取消擦除的程序以查看文件系统是否以某种方式保留了已删除文件的痕迹之外,没有什么可做的。
1赞 Maxime R. 6/9/2018
如果您只有一个文件并且删除了子模块存储库,请尝试以下脚本: gist.github.com/aroemen/5027030.gitmodules

答:

4赞 VonC 1/3/2015 #1

在 () 中初始化 git 存储库不会生成子模块。dir2cd dir2; git initdir2

它只是创建一个嵌套的存储库,任何父存储库都将忽略该存储库。
删除意味着您无法直接检索其内容。
dir2dir2

你可以用 之外的 repo 来做。
然后就有可能恢复.
git submodule add /another/path/dir2dir2dir1dir2

评论

4赞 artella 1/3/2015
补充一点,对于您上面提到的设置,您的原始命令将恢复git submodule update --initdir2
-1赞 rufreakde 5/6/2021 #2

如果您没有提交删除,您可以直接删除 提交所有其他本地更改,然后执行

git reset --hard
3赞 Unique 12/2/2021 #3

尝试通过以下两个命令“deinit”和“init”所有子模块:

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

评论

0赞 jegadeesh 4/9/2022
这在删除子模块文件以恢复它们后尝试时有效。
0赞 Syed Faizan Ahmed 8/1/2023
这对我有用,谢谢
6赞 Karmavil 2/19/2022 #4

如果您没有提交更改(至少) 你可以试试这个。它对我有用

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

就我而言,我认为恢复不起作用,因为它有子模块,这解决了它。

但最重要的是,我可以恢复对子模块所做的不需要的更改(一堆创建警告的二进制文件)

评论

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