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

我实际上正在学习如何使用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
' 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'选项选择另一个名称

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

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

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

79999 次浏览

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

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

这是最终为我工作(这篇文章帮了大忙):

如果你还没有运行
git rm --cached path_to_submodule(没有后面的斜杠)以及
rm -rf path_to_submodule < / p >

然后:

  1. .gitmodules文件中删除相关行。例如,删除这些:
[submodule "path_to_submodule"]
path = path_to_submodule
url = https://github.com/path_to_submodule
  1. 从.git/config中删除相关的部分。例如,删除这些:
[submodule "path_to_submodule"]
url = https://github.com/path_to_submodule
  1. rm -rf .git/modules/path_to_submodule

然后,你就可以:

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

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

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

我这样做后,尝试--forcegit submodule命令和rm所有其他目录,推到主等…目录不存在,也没有缓存的理由。结果在.git/modules中出现了这个错误。

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

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

这两个命令对我有用。

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

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

——name submodule_name 子模块路径 . git子模块add

这将把你的子模块添加到你的项目中,并将作为一个结构添加到.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 submodule sync为你更新的配置。