git状态返回致命错误:不是git存储库,但存在.git,HEAD具有适当的权限

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

我已经检查和.git存在,并包含适当权限的HEAD。 我可以运行其他各种命令。 如果我运行git gui,它会打开罚款,并会列出一些更改的文件,但缺less了很多。

我猜测HEAD可能会有某种forms的腐败,但是不确定。 任何想法如何解决这个问题,而不消除整个回购?

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

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

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

所以,如果你移动回购,这两个文件中的绝对path是无效的,并导致“不是一个混帐存储库”的错误。 只需手动修复这些文件。

旧版本的git使用绝对path来定位子模块的gitdir。 解决scheme如下:

  1. 将git升级到最新版本 。 有人说你至less需要版本1.7.10。 我只是用git 1.8.3成功解决了这个问题。
  2. 删除所有损坏的子模块文件夹: rm -rf broken_submodule_folder
  3. 更新注册的子模块: git submodule update 。 您应该看到正在检出的子模块。

我终于明白,这个问题是由于一个子模块的问题。 简单地重命名repo目录会导致与该子模块的冲突。 看到讨论后我怎样才能重命名与子模块的Git存储库? 我意识到,克隆回购是一个更好的方式,而不是重命名目录,并解决了子模块的问题。

在@ ax003d 答案之后 ,你可以用下面的命令replace所有旧的path( old/path )和新的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" 

在replace之前,您可能需要检查旧path的样子:

 find . -type f \( -name ".git" -o \( -path "*.git/modules/*" -name config \) \) -print0 | xargs -0 grep --colour "old/path" 

我通过重新设置所有的git-submodules来解决这个问题

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

我也用submodules来解决这个问题,但是在分析完这两个文件之后

{子模块} / .git .git / modules / submodules / {submodule} / config

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

经过一些研究,我发现在我的情况下,我不得不添加git(command:module add git),错误消失了。

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

资源