git status返回致命:不是git存储库,但.git存在且HEAD具有适当的权限

时间:2012-04-13 15:51:26

标签: git

当我在我的仓库上运行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很困惑?

8 个答案:

答案 0 :(得分:81)

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

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

因此,如果移动了repo,这两个文件中的绝对路径无效,并导致'not a git repository'错误。只需手动修复这些文件。

答案 1 :(得分:37)

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

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

答案 2 :(得分:8)

我最终解释说问题是由于其中一个子模块出现问题。只需重命名repo目录就会导致与该子模块发生冲突。在How can I rename a git repository with submodules?中看到讨论之后,我意识到克隆repo是一种更好的方法,而不是重命名目录并解决了子模块的问题。

答案 3 :(得分:5)

我通过使用

重置所有git-submodules解决了这个问题
rm -rf .git/modules
git submodule update --init

答案 4 :(得分: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"

答案 5 :(得分:3)

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

Source

答案 6 :(得分:1)

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

{子模块} /。GIT中 的.git /模块/子模块/子模块{} /配置

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

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

答案 7 :(得分:0)

解决方案:

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

2)尝试-git状态。

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

rm -f .git / index git reset

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