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 rmrm -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目录”问题的主要内容,如果未能解决你的问题,请参考以下文章

将公共代码添加为 git 子模块的问题:“索引中已存在”

添加 git 子模块作为对 VS 中现有解决方案的引用

git 添加子模块

git中submodule子模块的添加使用和删除

git中submodule子模块的添加使用和删除

git中submodule子模块的添加使用和删除