实际上,我正在学习如何使用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
作为一个法国学生,我可能会错过一些英语文档,但我搜索,我真的不明白为什么我得到这个问题。
如果我能得到一个解决方案,我会很高兴,但只是一个解释也会很有帮助。
8条答案
按热度按时间ntjbwcob1#
我来到这个SO帖子,试图添加一个子模块,其路径与我最近删除的子模块相同。
这就是我最终的工作(this article helped out a lot):
如果你还没跑
git rm --cached path_to_submodule
(没有尾随斜杠)以及rm -rf path_to_submodule
然后:
1.从
.gitmodules
文件中删除相关行。例如,删除以下内容:1.从.git/config中删除相关部分。例如,删除以下内容:
rm -rf .git/modules/path_to_submodule
最后,您可以:
git submodule add https://github.com/path_to_submodule
olhwl3o22#
我尝试了jbmilgrom的解决方案,特别是我尝试了
git rm --cache
,这对我也不起作用,因为目录/子模块不在那里。对我起作用的是:rm -rf .git/modules/blah
git submodule add git://path.to.new
我在
git submodule
命令和rm
所有其他目录中尝试--force
,推送到master等...目录不存在,该高速缓存的原因。原来在.git/modules
中就是这个错误所在。6psbrbz93#
如果你已经删除了子模块目录,就像我做的那样,按照jbmilgrom的说明进行操作。关键是
rm -rf .git/modules/path_to_submodule
,但是继续首先备份你的整个父仓库目录。如果只有一个子模块,则删除
.gitmodules
piok6c0g4#
您可能已经从磁盘中删除了
'projets/fdf'
,但Git仓库中仍然有它。使用git rm -rf projets/fdf
将其从Git中删除,然后提交更改。之后您就可以将此文件夹添加为子模块。e0uiprwp5#
这两个命令对我很有用。
zvokhttg6#
您可以在克隆子模块时执行以下操作:
git子模块add --名称 * 子模块名称**子模块路径 *
这将把你的子模块添加到你的项目中,并将作为一个结构添加到
.gitmodules
文件中。如果你不想要旧的,你可以从
.gitmodules
结构中删除它,并从项目中删除子模块文件夹。zbdgwd5y7#
有同样的问题,这对我来说是个好主意:
从文档:
同步[--递归] [--] [...]
将子模块的远程URL配置设置同步到. gitmodules中指定的值。它只会影响那些在.git/config中已经有URL条目的子模块(即初始化或新添加的情况)。当子模块的URL在上游更改并且您需要相应地更新本地仓库时,这很有用。
问题是,尽管您的
.gitmodules
文件被更新,但底层配置.git/modules/tools/libft
仍然指向旧的子模块URL。其他推荐
rm -rf .git/modules/<repo>
的解决方案只是删除git submodule sync
为您更新的配置。2skhul338#
我添加了一个空的子模块(没有文件,分支),并尝试其他答案中的命令删除它。
然而,在删除文件的同时,本地git目录仍然存在,所以我不得不转到
.git
文件夹并手动删除.git/modules/SUBMODULE-PATH
中的子模块,这最终解决了这个错误并使git submodule add
工作。.git
文件夹是隐藏的。在Windows上,您可以在文件资源管理器的“查看”下启用“隐藏项目”,然后从根文件夹访问它。