Git子模块添加:“在本地找到git目录”问题

时间:2014-01-05 02:32:03

标签: git git-submodules

我实际上是在尝试学习如何使用git,包括git submodule子命令。 我已经设置了一个服务器,我可以使用SSH来托管,推送和拉取git存储库。 我在这台服务器上创建了一个主要的git存储库“Travail”,我希望将所有项目作为子模块。

在我的Travail存储库中,我已经在tools/libft添加了一个我的项目作为子模块: 我能够开发这个子模块,推动和拉动它。

但是当我尝试添加另一个子模块(名为fdf,来自我服务器上的fdf.git)时,我遇到以下问题:

git submodule add ssh://XXX.XXX.XXX.XXX:XXXXX/opt/git/fdf.git projets/fdf
  

在本地找到'projets / fdf'的git目录,其中包含remote:s:         来源ssh://git@XXX.XXX.XXX.XXX:XXXXX / opt / git / fdf.git       如果要重用此本地git目录而不是再次克隆         SSH://XXX.XXX.XXX.XXX:XXXXX的/ opt / git的/ fdf.git       使用'--force'选项。如果本地git目录不是正确的repo       或者您不确定这意味着使用'--name'选项选择其他名称。

projets/

中实际上没有子目录

我在另一个线程上读到我应该使用git submodule sync或编辑.gitmodules文件,其中我的子模块的源存储库的URL可能已经改变。

但我的.gitmodules文件只包含有关我的第一个子模块(tools / libft)的信息,而不是关于projets / fdf的信息:

[submodule "tools/libft"]
    path = tools/libft
    url = ssh://git@XXX.XXX.XXX.XXX:XXXXX/opt/git/libft.git

作为一名法国学生,我可能错过了我所拥有的英文文档中的内容,但我搜索过,而且我真的不明白为什么会遇到这个问题。

如果我能得到一个解决方案,我会很高兴,但只是一个解释也会有所帮助。

6 个答案:

答案 0 :(得分:287)

我来到这篇SO帖子试图添加一个子模块,其路径与我最近删除的子模块相同。

这最终对我有用(this article helped out a lot):

如果你还没有运行git rm --cached path_to_submodule(没有尾随斜杠)和rm -rf path_to_submodule,那就去做吧!

然后:

  1. 删除.gitmodules文件中的相关行。例如删除这些:

    [submodule "path_to_submodule"] path = path_to_submodule url = https://github.com/path_to_submodule

  2. 从.git / config中删除相关部分。例如删除这些:

    [submodule "path_to_submodule"] url = https://github.com/path_to_submodule

  3. rm -rf .git/modules/path_to_submodule

  4. 然后,你终于可以了:

    git submodule add https://github.com/path_to_submodule

答案 1 :(得分:39)

我尝试了jbmilgrom的解决方案,特别是我尝试了git rm --cache,但由于目录/子模块不存在,这对我不起作用。对我有用的是:

  1. rm -rf .git/modules/blah
  2. git submodule add git://path.to.new
  3. 我在--force命令和git submodule所有其他目录中尝试rm之后执行此操作,推送到掌握等...目录不存在且没有理由用于缓存。原来是.git/modules这个错误所在的位置。

答案 2 :(得分:15)

您可能已从磁盘中删除了'projets/fdf',但您的Git存储库仍然拥有它。使用git rm -rf projets/fdf将其从Git中删除,然后提交更改。之后,您将能够将此文件夹添加为子模块。

答案 3 :(得分:11)

如果你已经像我一样删除了子模块目录,请按照jbmilgrom的其余说明进行操作。关键是rm -rf .git/modules/path_to_submodule,但请继续首先备份整个父回购目录

如果您只有一个子模块,请删除.gitmodules

答案 4 :(得分:2)

这两个命令对我有用。

$this->variableName

答案 5 :(得分:0)

您可以在克隆子模块时执行此操作:

git子模块添加--name submodule_name 子模块路径

这会将您的子模块添加到您的项目中,并将作为结构添加到.gitmodules文件下。

然后,如果您不想使用较旧的版本,则可以将其从.gitmodules结构中删除,然后从项目中删除子模块文件夹。