我实际上是在尝试学习如何使用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目录,其中包含remote: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
作为一名法国学生,我可能错过了我所拥有的英文文档中的内容,但我搜索过,而且我真的不明白为什么会遇到这个问题。
如果我能得到一个解决方案,我会很高兴,但只是一个解释也会有所帮助。
答案 0 :(得分:287)
我来到这篇SO帖子试图添加一个子模块,其路径与我最近删除的子模块相同。
这最终对我有用(this article helped out a lot):
如果你还没有运行git rm --cached 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 submodule add https://github.com/path_to_submodule
答案 1 :(得分:39)
我尝试了jbmilgrom的解决方案,特别是我尝试了git rm --cache
,但由于目录/子模块不存在,这对我不起作用。对我有用的是:
rm -rf .git/modules/blah
git submodule add git://path.to.new
我在--force
命令和git submodule
所有其他目录中尝试rm
之后执行此操作,推送到掌握等...目录不存在且没有理由用于缓存。原来是.git/modules
这个错误所在的位置。
答案 2 :(得分:15)
您可能已从磁盘中删除了'projets/fdf'
,但您的Git存储库仍然拥有它。使用git rm -rf projets/fdf
将其从Git中删除,然后提交更改。之后,您将能够将此文件夹添加为子模块。
答案 3 :(得分:11)
如果你已经像我一样删除了子模块目录,请按照jbmilgrom的其余说明进行操作。关键是rm -rf .git/modules/path_to_submodule
,但请继续首先备份整个父回购目录。
如果您只有一个子模块,请删除.gitmodules
答案 4 :(得分:2)
这两个命令对我有用。
$this->variableName
答案 5 :(得分:0)
您可以在克隆子模块时执行此操作:
git子模块添加--name submodule_name 子模块路径
这会将您的子模块添加到您的项目中,并将作为结构添加到.gitmodules
文件下。
然后,如果您不想使用较旧的版本,则可以将其从.gitmodules
结构中删除,然后从项目中删除子模块文件夹。