Git submodule add:“在本地找到一个git目录”问题

axzmvihb  于 2023-04-10  发布在  Git
关注(0)|答案(8)|浏览(281)

实际上,我正在学习如何使用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目录,其中包含远程: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目录不是正确的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

作为一个法国学生,我可能会错过一些英语文档,但我搜索,我真的不明白为什么我得到这个问题。
如果我能得到一个解决方案,我会很高兴,但只是一个解释也会很有帮助。

ntjbwcob

ntjbwcob1#

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

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
olhwl3o2

olhwl3o22#

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

  1. rm -rf .git/modules/blah
  2. git submodule add git://path.to.new
    我在git submodule命令和rm所有其他目录中尝试--force,推送到master等...目录不存在,该高速缓存的原因。原来在.git/modules中就是这个错误所在。
6psbrbz9

6psbrbz93#

如果你已经删除了子模块目录,就像我做的那样,按照jbmilgrom的说明进行操作。关键是rm -rf .git/modules/path_to_submodule,但是继续首先备份你的整个父仓库目录
如果只有一个子模块,则删除.gitmodules

piok6c0g

piok6c0g4#

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

e0uiprwp

e0uiprwp5#

这两个命令对我很有用。

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

zvokhttg6#

您可以在克隆子模块时执行以下操作:
git子模块add --名称 * 子模块名称**子模块路径 *
这将把你的子模块添加到你的项目中,并将作为一个结构添加到.gitmodules文件中。
如果你不想要旧的,你可以从.gitmodules结构中删除它,并从项目中删除子模块文件夹。

zbdgwd5y

zbdgwd5y7#

有同样的问题,这对我来说是个好主意:

# 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中指定的值。它只会影响那些在.git/config中已经有URL条目的子模块(即初始化或新添加的情况)。当子模块的URL在上游更改并且您需要相应地更新本地仓库时,这很有用。
问题是,尽管您的.gitmodules文件被更新,但底层配置.git/modules/tools/libft仍然指向旧的子模块URL。
其他推荐rm -rf .git/modules/<repo>的解决方案只是删除git submodule sync为您更新的配置。

2skhul33

2skhul338#

我添加了一个空的子模块(没有文件,分支),并尝试其他答案中的命令删除它。
然而,在删除文件的同时,本地git目录仍然存在,所以我不得不转到.git文件夹并手动删除.git/modules/SUBMODULE-PATH中的子模块,这最终解决了这个错误并使git submodule add工作。
.git文件夹是隐藏的。在Windows上,您可以在文件资源管理器的“查看”下启用“隐藏项目”,然后从根文件夹访问它。

相关问题