git submodule add致命错误:不是Git仓库

10

我对Git还比较新,尽力想找到一些关于这个问题的文档但没有找到。

这是我的命令:

$ git submodule add https://github.com/joliver/EventStore.git externalsource/JOliverEventStore/ 

致命错误:不是一个 git 子模块:../.git/modules/externalsource/JOliverEventStore 无法检出子模块 'externalsource/JOliverEventStore'

我现在在我的存储库根目录下,当前没有名为/externalsource/JOliverEventStore/的目录。这个错误信息涉及到一个我完全不了解的目录。

如果我像这样将子模块添加到根目录:

$ git submodule add https://github.com/joliver/EventStore.git JOliverEventStore 

我没有问题,它会在根目录中创建文件夹。

非常感谢您的任何见解。


你尝试创建externalsource目录,然后进入该目录并添加子模块了吗? - Not_a_Golfer
我这样做了,但是当添加子模块时,必须从根目录进行操作,这是错误的原因。 - Brandon Grossutti
在原始命令的JOliverEventStore末尾有一个斜线。也许git太愚蠢了,认为你想要在JOliverEventStore目录下检出到JOliverEventStore(该目录不存在)? - Mikko Rantalainen
3个回答

12
可能取决于您使用的Git版本:这个最近的讨论帖子(2012年2月)提到了一个错误:

最近,具有名称<name>的子模块在超级项目中的git目录位于.git/modules/<name>目录中,而工作树包含指向该目录的gitfile

当同一子模块添加到以前不存在的分支上时(在.gitmodules文件中不会找到它),名称不像应该从路径中初始化。
这导致在找到.git/modules/<name>目录时输入到gitfile的路径错误,因为它愉快地使用了现在为空的名称。
即使我们在目录层次结构中有更深的路径,它也总是只指向单个目录向上。

但更一般来说,请使用git submodule命令的<path>参数:

<path>是克隆子模块存在于超级项目中的相对位置。

  • 如果<path>不存在,则通过从命名URL克隆创建子模块。
  • 如果<path>存在并且已经是有效的git存储库,则将其添加到更改集中而不进行克隆。
    提供第二种形式是为了方便从头开始创建新子模块,并假设用户稍后将推送子模块到给定的URL。

eoinoc评论中提到了另一个原因,该原因在问题“git status返回fatal: Not a git repository but .git exists and HEAD has proper permissions”中有详细说明。

我的仓库位置已经更改,我需要更新git的配置文件。


感谢vonc。我也看到了那篇文章。可能需要更新。但我不知道它是否在最新版本中解决了。这似乎是一个很常见的任务,我很惊讶会出现这个问题。 - Brandon Grossutti
从 Mountain Lion 自带的 git 1.6.x 升级到 1.8.1 可以解决这个问题。 - Paul Schreiber
2
这个 bug 不是导致我看到相同错误信息的原因。我的仓库位置已经改变,我需要更新 git 的配置文件:https://dev59.com/4Gkw5IYBdhLWcg3wGGm8 - eoinoc
1
@eoinoc 很高兴知道。我已经将你的评论包含在答案中,以增加可见度。 - VonC

9

这可能看起来很傻,但我刚刚在那个愚蠢的错误上浪费了30分钟...

您的父代码库必须已经作为git仓库创建。我刚刚创建了父代码库,然后我创建了子模块并尝试将其git submodule add到父代码库中。然而,父代码库并没有初始化为git仓库。

这导致了与您提到的相同的错误("不是git仓库"),但实际上是父代码库不是git仓库...太傻了。


5

我为了一个简单的问题浪费了几分钟时间

首先执行git init

然后安装主题git submodule add https://github.com/joliver/EventStore.git JOliverEventStore


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接