2012-04-13 78 views
50

当我在我的回购运行git状态,我得到fatal: Not a git repository: /my repo/.git/modules/docsgit的状态返回致命的:不是git仓库git的,但存在和头部有适当的权限

我检查和git的存在并包含头正确权限。我可以很好地运行其他各种命令。如果我运行git gui,它会打开并且会列出几个已更改的文件,但缺少很多。

我猜在HEAD中可能存在某种腐败,但不确定。任何想法如何解决这个问题,而不消除整个回购?

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

+0

您是嵌套的git存储库? – nes1983 2012-04-13 15:53:26

+0

@ nes1983我有几个子模块,但是这个问题与主要的回购。 – 2012-04-13 21:41:33

回答

7

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

+0

从这个问题恢复只需要每个子模块两个小的手动编辑。对我来说,这比重新克隆存储库及其所有子模块更容易。 – 2013-03-06 23:24:28

+1

@JoshFarneman我应该如何(新手)了解你所做的。请在前后提供'清除代码'。所以人们可以理解需要什么。 – alex 2017-04-06 17:32:42

75

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

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

所以,如果你移动的回购,这两个文件的绝对路径是无效的,并导致“不是git仓库”的错误。只需手动修复这些文件。

+10

谢谢,这对我很好。但是,第二条路对我来说有点短:'.git/modules/{submodule}/config'(我在Ubuntu上使用git版本1.7.9.5) – 2013-01-29 17:04:20

+1

我刚刚从PC移动到Mac,并且遇到同样的问题。我更新了这两个文件中的路径,并且新路径是正确的,但我仍然遇到'致命的:不是git存储库'。在那个位置有一个.git文件,所以也许我错过了其他的东西? – 2014-01-15 17:08:59

+3

这里只需要说明一下,对于我来说,配置文件具有与.git文件不同的相对路径。 – 2017-03-13 15:50:39

35

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

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

谢谢!为我节省了很多工作,这个! :-) – Potherca 2015-04-20 10:31:23

1

我面临着子模块这个问题为好,但分析这两个文件

{}子模块/。混帐 的.git /模块/子模块/ {}子模块/配置

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

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

+1

你说的这个'module add git'命令是什么? – 2017-09-19 19:59:04

4

继@ ax003d answer,您可以使用此命令替换为新的路径(new/path)所有旧的路径(old/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" 
4

我通过正在重置所有混帐子模块与

rm -rf .git/modules 
git submodule update --init 
解决了这个问题
+0

哇!刚刚为我工作!在我的情况下,我不小心做了一个没有通配符匹配的“rm -r”。它在停止提示之前从项目根目录中擦除了一些文件。 – Sankalp 2016-06-08 09:27:30

1

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

Source