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如下:
- 将git升级到最新版本 。 有人说你至less需要版本1.7.10。 我只是用git 1.8.3成功解决了这个问题。
- 删除所有损坏的子模块文件夹:
rm -rf broken_submodule_folder
- 更新注册的子模块:
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,并再次运行。
资源