我实际上是在学习如何使用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

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

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


当前回答

这两个命令对我有用。

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

其他回答

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

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

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

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

我也有同样的问题,这招对我很管用

# force register the submodule in .gitmodules
git submodule add -f <name> <path>

# force git to update cached submodule configs
git submodule sync --recursive

从文档中可以看出:

同步[——递归][——][…] 同步子模块的远程URL配置设置为.gitmodules中指定的值。它 将只影响那些已经有URL入口的子模块 .git/config(这是初始化或新鲜时的情况 添加)。当子模块的url在上游发生变化时,这很有用 需要相应地更新本地存储库。

问题是,尽管你的.gitmodules文件被更新了,但底层的配置.git/modules/tools/libft仍然指向旧的子模块URL。

其他建议rm -rf .git/modules/<repo>的解决方案只是删除了git子模块同步更新的配置。

我来到这篇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

这两个命令对我有用。

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

你可能已经从磁盘上删除了你的“projects /fdf”,但是你的Git存储库仍然保留着它。使用git rm -rf projets/fdf将其从git中删除,然后提交更改。在此之后,您将能够将此文件夹作为子模块添加。