【问题标题】:git status returns fatal: Not a git repository but .git exists and HEAD has proper permissionsgit status 返回致命:不是 git 存储库,但存在 .git 并且 HEAD 具有适当的权限
【发布时间】:2012-04-13 15:51:25
【问题描述】:

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

【问题讨论】:

  • 你在嵌套 git 存储库吗?
  • @nes1983 我确实有几个子模块,但是这个问题与主仓库有关。

标签: git


【解决方案1】:

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

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

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

【讨论】:

  • 谢谢,这对我很有效。但是,第二条路径对我来说有点短:.git/modules/{submodule}/config(我在 Ubuntu 上使用 git 版本 1.7.9.5)
  • 我刚从 PC 转移到 Mac 并遇到了同样的问题。我更新了这两个文件中的路径,新路径是正确的,但我仍然得到fatal: Not a git repository。该位置有一个 .git 文件,所以也许我还缺少其他东西?
  • 这里只是一个注释,对我来说,配置文件有一个与 .git 文件不同的相对路径。
【解决方案2】:

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

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

【讨论】:

  • 我知道这是一个旧答案,但只是想让其他人知道:它在 2018 年仍然是一个很好的答案。谢谢!
【解决方案3】:

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

【讨论】:

  • 从这个问题中恢复只需要对每个子模块进行两次小的手动编辑。对我来说,这比重新克隆存储库及其所有子模块要容易。
  • @JoshFarneman 我(新手)应该如何理解你做了什么。请在前后提供clear code。所以人们可以理解需要什么。
  • 但是如果我不想失去我的本地分支机构怎么办。 ?请帮助我在这种情况下该怎么做。
【解决方案4】:

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

Source

【讨论】:

    【解决方案5】:

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

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

    【讨论】:

    • 哇!刚刚为我工作!就我而言,我不小心做了一个没有通配符匹配的“rm -r”。它从项目根目录中擦除了几个文件,然后因某些提示而停止。
    【解决方案6】:

    在 @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"
    

    【讨论】:

      【解决方案7】:

      解决方案:

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

      2) 尝试 - git 状态。

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

      rm -f .git/index git 重置

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

      【讨论】:

      • 谢谢,这为我解决了问题。我猜我的 HEAD 文件不知何故损坏了。没有像 OP 这样的子模块,只是突然突然收到可怕的“致命:不是 git 存储库”
      【解决方案8】:

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

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

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

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

      【讨论】:

      • 在 Linux 命令提示符下运行 - module add got,我收到以下错误。模块:找不到命令
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-08-11
      • 1970-01-01
      • 2015-07-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多