我实际上是在学习如何使用git,包括git子模块子命令。 我已经建立了一个服务器,在这个服务器上我可以使用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

' projects /fdf'的git目录在本地远程(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”选项选择另一个名称。

在projects /中实际上没有子目录

我在另一个线程上读到,我应该使用git子模块同步或编辑.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

作为一名法国学生,我可能在我的英文文档中遗漏了一些东西,但我搜索了一下,我真的不明白为什么我会遇到这个问题。

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


当前回答

你可以在克隆子模块时做到这一点:

Git子模块add——name submodule_name子模块路径

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

然后如果你不想要旧的,你可以从。gitmodules结构中删除它,并从项目中删除子模块文件夹。

其他回答

我尝试了jbmilgrom的解决方案,特别是我尝试了git rm——cache,这对我来说也没有作用,因为目录/子模块不在那里。对我有用的是:

Rm -rf .git/modules/blah Git子模块添加Git://path.to.new

我在git子模块命令和rm所有其他目录下尝试——force, push to master等之后做到了这一点…目录不存在,也没有缓存的理由。结果在.git/modules中出现了这个错误。

这两个命令对我有用。

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

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

这就是最终对我有用的方法(这篇文章帮了大忙):

如果你还没跑过 Git rm——缓存path_to_submodule(没有后面的斜杠)以及 Rm -rf path_to_submodule

然后:

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

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

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

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

Rm -rf .git/modules/path_to_submodule

然后,你就可以:

Git子模块添加https://github.com/path_to_submodule

你可以在克隆子模块时做到这一点:

Git子模块add——name submodule_name子模块路径

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

然后如果你不想要旧的,你可以从。gitmodules结构中删除它,并从项目中删除子模块文件夹。

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

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