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


190

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

在我的Travail存储库中,我已经在以下位置添加了我的项目作为子模块tools/libft:我能够开发该子模块,进行推入和拉出。

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

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

可以在本地使用远程工具找到'projets / fdf'的git目录:origin ssh://git@XXX.XXX.XXX.XXX:XXXXX / opt / git / fdf.git如果要重用此本地git目录,而不是从ssh://XXX.XXX.XXX.XXX:XXXXX / opt / git / fdf.git再次克隆,请使用'--force'选项。如果本地git目录不是正确的仓库,或者您不确定这意味着什么,请使用'--name'选项选择另一个名称。

实际上在这里没有子目录 projets/

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

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

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

作为一名法国学生,我可能会错过英语文档中的某些内容,但是我进行了搜索,但我真的不明白为什么会遇到这个问题。

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


一个小小的更正:它是“存储库”,而不是“存储库”。这不是一个真正的答案,但是如果项目彼此独立,那么每个项目最好有自己的存储库而不是子模块。
jcm 2014年

谢谢,我纠正了。我知道,但我想将所有工作都收集在同一个仓库中,但作为单独的项目。当我从家到学校时,可以保持我的全部工作更新,反之亦然(我想知道如何使用这些工具,这是一种选择;))
vmonteco 2014年

好吧,好奇心永远是一个很好的理由!:)这很奇怪。您确定之前没有添加子模块吗?
jcm 2014年

不在Travail /中,我也没有问题可以在〜/中克隆fdf.git。在Travail /中,我找不到fdf的痕迹。只是libft:/
vmonteco'1

5
哦,等等,我看了看,/Travail/.git/modules/projets/找到了fdf目录。这似乎不在工作树中,而在较早的提交中。会产生问题吗?
vmonteco'1

Answers:


438

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

这是最终为我工作的东西(这篇文章对我有很大帮助):

如果还没有运行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

然后,您终于可以:

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


47
这真的很有帮助,因为我找不到其他有效的方法。与其他建议的主要区别是您的步骤3。谢谢!
AndroidDev '16

8
我需要步骤2和3。
U007D '16

8
我需要步骤3,但是为什么子模块也在那里存在?
Crt

1
对我来说,我跳过了第1步和第2步(其中已经设置了正确的设置),而第3步为我进行了修复。(我已经完成的初始步骤git rmrm -rf措施。)
李洛克

2
即使第3步对我也不起作用。我只有一个子模块,所以我删除了整个子模块.git/modules,结果一切正常。
ACH

47

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

  1. rm -rf .git/modules/blah
  2. git submodule add git://path.to.new

--forcegit submodule命令和rm所有其他目录中尝试之后执行了此操作,将其推送到master等...该目录不存在,没有理由进行缓存。原来在.git/modules这正是这个错误是在撒谎。


15

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


它的工作:)谢谢。我想我确实犯了这个错误。
vmonteco 2014年

21
这样做时,我被告知该目录不存在。似乎两者都存在和不存在:/
内森·霍恩

41
@ tom-mcfarlin最后,我手动删除了.gitmodule中的行和.git / modules中的文件夹,然后让我添加了一个新的子模块。也许有更好的方法可以做到这一点,但是我已经没时间了。如果您要采用这种方式,我建议您做个很好的备份,如果对您不利,请不要怪我。祝好运。
sparklos 2015年

5
谢谢,我在另一篇文章中发现从.git / modules中删除该文件夹,并且对我有用。很有道理,因为那是错误所说的是冲突……我只是不知道那个文件夹
Tom McFarlin

10
@NathanHornby @Sparklos @TomMcFarlin-在最新版本的git中,您会发现git-submodule在.git文件夹中添加了一个目录。例如,如果您在directory目录中/tmp/repo,然后运行git submodule add ../otherrepo.git,那么您将看到该/tmp/repo/.git/modules/otherrepo文件夹存在。那就是我的问题所在。我从.git手动删除了该文件夹,一切正常。
亚历山大·伯德

13

如果您已经像我一样删除了子模块目录,请遵循jbmilgrom的其余说明。关键是rm -rf .git/modules/path_to_submodule但是继续先备份整个父仓库目录

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


2

这两个命令对我有用。

rm path/to/submodule -rf
rm .git/modules/path/to/module -rf

这个。似乎有两种创建子模块的方法。在其中一个文件夹中,子文件夹将只有一个.git文件,该文件仅指向超级项目中的目录,以开头.git/modules/。在其中有一个文件夹,用于存储子模块的存储库。删除该存储库为我解决了该问题,而被接受的答案却没有。
威廉·兰道昆
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.