如何“解决fatal: Not a git repository”?

64

我试图从项目中移除一个子模块

尝试使用 rm -rf .git/modules/submodulePath 命令

之后我遇到了以下问题:

致命错误:不是一个 git 仓库


请列出您的文件夹结构,如果可能的话。 - Shivkumar kondi
8个回答

64

这两个文件包含绝对的子模块路径:

{submodule}/.git
.git/modules/{submodule}/config

所以,如果你移动了仓库,这两个文件中的绝对路径就不再有效,会导致“不是git仓库”的错误。只需手动修复这些文件即可。

更新:

1.) 从.gitmodules文件中删除相关部分。可以使用以下命令:

git config -f .gitmodules --remove-section "submodule.submodule_name"

2.) 将.gitmodules更改暂存

git add .gitmodules

3.) 从 .git/config 文件中删除相关部分。您可以使用以下命令:

git submodule deinit -f "submodule_name"

4.) 删除gitlink(没有斜杠):

git rm --cached path_to_submodule

5.) 清理 .git/modules 目录:

rm -rf .git/modules/path_to_submodule

6.) 提交:

git commit -m "Removed submodule <name>"

7.) 删除未跟踪的子模块文件

rm -rf path_to_submodule

我找不到任何与我删除的子模块相关的文件夹。 - coreDeviOS
@coreDeviOS 更新了在 Git 中删除子模块的常规方法。请查看并让我知道您是否有任何问题。 - Shivkumar kondi
1
在我的情况下,在编辑了.git/config文件后,我需要执行git reset - ton
这两个文件对我来说都只包含相对路径。git 版本为 2.27.0 - David Gay
我其实只需要在这里执行 submodule deinit,谢谢提供信息! - Jay
由于某些原因,我的项目中只有几个子模块包含绝对路径,其余的都包含相对路径。我将绝对路径条目更改为相对路径,然后一切正常。 - bobobobo

19

我遇到了这个问题,在我的主仓库中没有.git/modules目录。我有一个子模块"build",所以只需删除任何引用并重新初始化它:

rm -rf .git/modules
rm -rf build
git submodule init
git submodule update

正是我所需要的,简短而精炼。 - CodeMonkey
这对我来说是个救星! - Gleb Ignatev
这些命令在Windows系统中的等效命令是rd /s /q <dir>(在命令提示符中)或者rd -r <dir>(在PowerShell中)。详细信息请参考https://stackoverflow.com/a/97896/11502722。 - undefined
实际上,对于PowerShell来说,Remove-Item <dir> -Recurse -Force可能更好。您可以在https://stackoverflow.com/questions/25798272/cannot-delete-a-file-even-when-logged-in-as-an-administrator上找到更多信息。 - undefined

12

我刚遇到了这个问题。

在我的情况下,这是由于检出具有不同子模块的分支造成的。

  • 一个分支有一些子模块,但是
  • 另一个分支有2个以上的子模块。

由于某种原因,它们无法使用以下命令初始化:

git submodule update --recursive --init

我需要手动删除这些文件/目录,然后更新才能正常工作。

{submodule-path}/.git
.git/modules/{submodule}/config

2
删除 <submodule-path>/.git 文件解决了我的问题。 - driedler
只需使用 rm -rf 子模块路径 命令即可。谢谢~ - guozqzzu

9

我把一个git仓库移动到了另一个文件夹后,遇到了这个错误。当我查看时:

{submodule}/.git

我看到了一行只有一个绝对路径,例如:

gitdir: /Users/ajx/Documents/repo/.git/modules/{submodule}

我将其更改为相对路径,例如:

gitdir: ../../.git/modules/{submodule}

我不确定为什么git会硬编码绝对路径...



2

您可以简单地更新.git文件

nano {我的子模块}/.git

使用正确的gitdir。

因为我认为您更改了文件夹的路径。


1
在我的情况下,当我尝试执行git commit -m "***"时,出现了如下问题: fatal: not a git repository: library-sp18/../.git/modules/library-sp18
我的解决方案是: 删除library-sp18中的.git文件并执行git init

0
  1. 从存储库的 .git/config 中删除子模块部分
  2. 删除子模块目录:
rm -rf {submodule-path}
rm -rf .git/modules/*

这些都是子模块信息保存的区域


0

当我从开发分支切换到包含新子模块的特性分支时,我也遇到了这个问题。

在尝试了上述所有解决方案后,我注意到问题的原因是一个 git 配置选项:submodule.recurse = true

它试图在检出时获取模块,但子模块没有被正确初始化。


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