Git子模块添加:“在本地找到一个git目录”问题
Posted
技术标签:
【中文标题】Git子模块添加:“在本地找到一个git目录”问题【英文标题】:Git submodule add: "a git directory is found locally" issue 【发布时间】:2014-01-22 15:20:21 【问题描述】:我实际上是在尝试学习如何使用 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 目录在本地找到,带有远程: 来源 ssh://git@XXX.XXX.XXX.XXX:XXXXXX/opt/git/fdf.git 如果你想重用这个本地 git 目录而不是从 ssh://XXX.XXX.XXX.XXX:XXXXXX/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
作为一名法国学生,我可能会错过我所拥有的英文文档中的某些内容,但我搜索了一下,我真的不明白为什么会出现这个问题。
如果我能得到一个解决方案,我会很高兴,但只是一个解释也会有帮助。
【问题讨论】:
一个小的更正:它是“存储库”,而不是“存储库”。不是一个真正的答案,但如果项目彼此独立,那么每个项目都有自己的 repo 而不是子模块会更好。 谢谢,我更正了。我知道,但我想将我所有的工作收集在同一个仓库中,但作为单独的项目。当我从家到学校时,可以选择让我的整个工作保持更新,反之亦然(学习如何使用这些工具,我很好奇;)) 好吧,好奇总是一个很好的理由! :) 这很奇怪。你确定你之前没有添加过子模块吗? 不在 Travail/ 中,而且我没有在 ~/ 中克隆 fdf.git 的问题。在 Travail/ 我没有找到 fdf 的痕迹。只是 libft :/ 哦,等等,我查看了/Travail/.git/modules/projets/
并找到了fdf
目录。这似乎不在工作树中,而是在较旧的提交中。它会产生问题吗?
【参考方案1】:
我来到这篇 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
【讨论】:
这真的很有帮助,因为我找不到任何其他有用的方法。与其他建议的主要区别在于您的第 3 步。谢谢! 我需要步骤 2 和 3。 我需要第 3 步,但是为什么子模块也存在那里? 对我来说,我跳过了第 1 步和第 2 步(其中已经有正确的设置),第 3 步为我修复了它。 (我已经完成了git rm
和rm -rf
步骤的初始步骤。)
即使是第 3 步也不适合我。我只有一个子模块,所以我删除了整个 .git/modules
并最终工作。【参考方案2】:
我尝试了 jbmilgrom 的解决方案,特别是我尝试了git rm --cache
,但这对我也不起作用,因为目录/子模块不存在。对我有用的是:
rm -rf .git/modules/blah
git submodule add git://path.to.new
我在git submodule
命令和rm
所有其他目录中尝试--force
后执行此操作,推送到主目录等...该目录不存在,也没有缓存的原因。原来在.git/modules
这就是这个错误所在。
【讨论】:
【参考方案3】:您可能已经从磁盘中删除了您的 'projets/fdf'
,但您的 Git 存储库仍然有它。使用 git rm -rf projets/fdf
将其从 Git 中删除,然后提交更改。之后,您就可以将此文件夹添加为子模块。
【讨论】:
成功了 :) 谢谢。我想我确实犯了这个错误。 当我这样做时,我被告知目录不存在。似乎它既存在又不存在:/ @tom-mcfarlin 最后,我手动删除了 .gitmodule 中的行和 .git/modules 中的一个文件夹,然后它让我添加了一个新的子模块。也许有更好的方法来做到这一点,但我的时间不多了。如果你要走这条路,我建议你做好备份,如果你出错了,请不要怪我。祝你好运。 谢谢,我在另一篇文章中发现从 .git/modules 中删除该文件夹,这对我有用。有道理,因为这就是错误所说的冲突......我只是不知道那个文件夹 @NathanHornby @Sparklos @TomMcFarlin -- 在最新版本的 git 中,您会发现 git-submodule 在 .git 文件夹中添加了一个目录。例如,如果您在目录/tmp/repo
中,然后运行git submodule add ../otherrepo.git
,那么您将看到/tmp/repo/.git/modules/otherrepo
文件夹存在。这就是我的问题所在。我从 .git 中手动删除了该文件夹,一切正常。【参考方案4】:
如果您已经像我一样删除了子模块目录,请按照 jbmilgrom 的其余说明进行操作。关键是 rm -rf .git/modules/path_to_submodule
但请继续首先备份整个父 repo 目录。
如果您只有一个子模块,只需删除 .gitmodules
【讨论】:
【参考方案5】:这两个命令对我有用。
rm path/to/submodule -rf
rm .git/modules/path/to/module -rf
【讨论】:
这个。似乎有两种方法可以创建子模块。在其中一个中,子文件夹将只有一个 .git 文件,该文件仅指向超级项目中的一个目录,以.git/modules/
开头。其中有一个文件夹,用于存储子模块的存储库。删除该存储库为我解决了这个问题,而接受的答案却没有。【参考方案6】:
您可以在克隆子模块时执行此操作:
git submodule add --name submodule_name submodule path
这会将您的子模块添加到您的项目中,并将作为结构添加到.gitmodules
文件下。
然后,如果您不想要旧的,可以将其从.gitmodules
结构中删除并从项目中删除子模块文件夹。
【讨论】:
以上是关于Git子模块添加:“在本地找到一个git目录”问题的主要内容,如果未能解决你的问题,请参考以下文章