【问题标题】:Git submodule add: "a git directory is found locally" issueGit子模块添加:“在本地找到一个git目录”问题
【发布时间】: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 目录。这似乎不在工作树中,而是在较旧的提交中。它会产生问题吗?

标签: git git-submodules


【解决方案1】:

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

【讨论】:

  • 这真的很有帮助,因为我找不到任何其他有用的方法。与其他建议的主要区别在于您的第 3 步。谢谢!
  • 我需要步骤 2 和 3。
  • 我需要第 3 步,但是为什么子模块也存在那里?
  • 对我来说,我跳过了第 1 步和第 2 步(其中已经有正确的设置),第 3 步为我修复了它。 (我已经完成了git rmrm -rf 步骤的初始步骤。)
  • 即使是第 3 步也不适合我。我只有一个子模块,所以我删除了整个 .git/modules 并最终工作。
【解决方案2】:

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

  1. rm -rf .git/modules/blah
  2. 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 结构中删除并从项目中删除子模块文件夹。

      【讨论】:

        猜你喜欢
        • 2014-05-31
        • 1970-01-01
        • 2016-09-30
        • 1970-01-01
        • 2011-06-03
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多