63

当我在我的仓库上运行 git status 时,我得到fatal: Not a git repository: /my repo/.git/modules/docs

我已经检查过 .git 存在并包含具有适当权限的 HEAD 。我可以很好地运行各种其他命令。如果我运行 git gui,它会很好地打开并列出几个已更改的文件,但会丢失很多文件。

我猜 HEAD 中可能存在某种损坏,但不确定。知道如何在不清除整个回购的情况下解决这个问题吗?

更新:我意识到我已经更改了 repo 目录的名称。错误中引用的目录是该目录的旧名称。所以我目前的回购是在,/new dir/.git但错误是说Not a git repository: /old dir/.git/modules/docs。所以也许 git 很困惑?

4

8 回答 8

87

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

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

因此,如果您移动了存储库,这两个文件中的绝对路径无效,并导致“不是 git 存储库”错误。只需手动修复这些文件。

于 2012-12-15T15:40:36.593 回答
41

以前版本的 git 使用绝对路径来定位子模块的 gitdir。解决方法如下:

  1. 将 git 升级到最新版本。有人说您至少需要 1.7.10 版本。我刚刚用 git 1.8.3 成功解决了这个问题。
  2. 删除所有损坏的子模块文件夹:rm -rf broken_submodule_folder
  3. 更新已注册的子模块:git submodule update. 您应该看到子模块被签出。
于 2013-05-30T15:12:50.127 回答
9

我终于解决了这个问题是由于其中一个子模块的问题。简单地重命名 repo 目录会导致与该子模块发生冲突。在看到如何使用子模块重命名 git 存储库中的讨论之后?我意识到克隆 repo 是一种更好的方法,而不是重命名目录,并且解决了子模块的问题。

于 2012-04-16T20:02:37.860 回答
7

在我的情况下,问题是 .git/HEAD 文件没有指向任何地方,它只包含一系列奇怪的字符。我将 .git/ORIG_HEAD 的内容复制到 .git/HEAD 并再次工作。

来源

于 2017-03-14T05:57:43.877 回答
6

我通过重置所有 git-submodules 解决了这个问题

rm -rf .git/modules
git submodule update --init
于 2015-07-24T07:14:51.317 回答
4

在 @ax003d answer之后,您可以使用以下命令将所有旧路径 ( old/path) 替换为新路径 ( new/path):

find . -type f \( -name ".git" -o \( -path "*.git/modules/*" -name config \) \)  -print0 | xargs -0 sed -i -e "s#old/path#new/path#g"

您可能想在替换旧路径之前检查它们的样子:

find . -type f \( -name ".git" -o \( -path "*.git/modules/*" -name config \) \)  -print0 | xargs -0 grep --colour "old/path"
于 2014-09-05T00:17:39.257 回答
2

解决方案 :

1)查看 HEAD 文件(在 .git 下)-> 如果它已损坏(包含一些随机值),用此文本替换内容 'ref: refs/heads/develop'(develop 是我正在处理的最后一个分支)

2)尝试-git状态。

3)如果步骤 2 不能解决您的问题,请尝试这些命令(可能不适用于所有人,但值得一试)

rm -f .git/index git reset

4) git 将在重置后为您提供未暂存的文件。根据您的意愿保留或丢弃

于 2018-11-30T11:07:55.013 回答
1

我也遇到了子模块的这个问题,但是在分析了这两个文件之后

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

我意识到在我的情况下这不是问题。

经过一番研究,我发现在我的情况下,我必须添加 git(命令:module add git)并且错误消失了。

于 2014-06-16T08:39:07.623 回答