git - 如何将 Git 存储库转换为嵌套在另一个(父)Git 存储库中的子模块?

标签 git version-control repository git-submodules git-extensions

我有一个 Git 存储库,其中包含作为 Git 子存储库的子文件夹。

+ main (local GIT repo)
  + subdirectory1
     + plugin1 (created as local GIT repo)
     + plugin2 (created as local GIT repo)
  + subdirectory2
    + subdirectory2a
      + plugin3 (created as local GIT repo)
  + subdirectory3

plugin1、plugin2、plugin3 是主 Git repo 的子文件夹(subrepos)。
此外,plugin1、plugin2、plugin3 作为本地 Git 存储库启动,并添加了内容和历史记录。

我想将插件 1、插件 2、插件 3 从 Git 子存储库转换为主 Git 存储库中的子模块。

我想在插件的 Git 存储库中单独进行开发,但仍将它们保留为子文件夹。它们还应该在主 Git 存储库中显示为链接。

我使用 Git Extensions 作为开发版本控制 GUI。

最佳答案

更改为 主要 目录, checkout master 分支,然后执行以下 Git 命令为 plugin1 创建一个新的子模块:

git submodule add (url_to_plugin1_repository) subdirectory1/plugin1sm

这里的“url_to_plugin1_repository”指向你当前的 Git 存储库 插件1 .将创建一个新目录调用 子目录1/plugin1sm ,它将跟踪您的远程存储库。我给它起了一个不同的名字来和 区别开来。插件1 不是子模块的目录。请注意,Git 将克隆 的数据。插件1sm 来自远程 url 的目录,而不仅仅是从本地复制。话虽如此,如果您在本地 中有任何未提交的更改插件1 存储库,您应该在执行上述步骤之前提交并推送它们。

此时,从 执行 git status主要 目录应显示类似于以下内容:
$ git status
# On branch master
# Changes to be committed:
#   (use "git reset HEAD ..." to unstage)
#
#   new file:   .gitmodules
#   new file:   subdirectory1/plugin1sm

由于您在主要 目录下,新的子模块在变更集中显示为"file"。您可以使用以下命令提交此更改:
$ git add subdirectory1/plugin1sm
$ git commit -m "Created submodule for plugin1"
$ git push origin master

您可能会想到的下一个问题是如何将新的子模块与您的主 Git 存储库一起使用。让我们先来看看在 中处理文件时会发生什么。插件1sm 目录。当您在 内工作时插件1sm 目录,Git 将跟踪更改并表现得好像它不知道该目录之外的任何内容。当需要提交和推送您的更改时,您可以使用以下预期命令:
$ cd subdirectory1/plugin1sm
$ git add <yourfile>
$ git commit -m "modified my file"
$ git push

但是主存储库呢?这是事情变得有点有趣的地方。由于您修改了 插件1sm 子模块,它将在主存储库的变更集中显示为修改后的"file"。要继续,您可以添加子模块并使用以下命令推送它:
$ cd ../../
$ git add subdirectory1/plugin1sm
$ git commit -m "updated my submodule"
$ git push origin master

总而言之,您在子模块中的基本 Git 工作流程将照常进行,并且在您的 内。主要 存储库,您需要记住整个子模块将显示为一个文件。事情变得比我们在这里考虑的简单用例更复杂,但希望这能让你走上正确的道路。

您可以对 重复此过程。插件2 插件3 目录。当您完成创建子模块后,您应该能够删除原始插件目录。

关于git - 如何将 Git 存储库转换为嵌套在另一个(父)Git 存储库中的子模块?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28306781/

相关文章:

git - 我如何 git pull -f

svn - 如何将具有历史记录的 SVN 存储库迁移到新的 Git 存储库?

version-control - Perforce 与已删除目标的集成

安卓源 : Repo not displaying any initialization message

git - 如何将现有的裸 git 存储库导入 Gitlab?

git - 在 AWS 实例中克隆 git 存储库?我收到错误 : Failed to connect to github. com 端口 443:连接超时

git - Cherry 选择压扁的提交

git - 折叠一个 git 仓库的历史

android - 是否可以在同一个源代码管理和 IDE 中管理 NokiaX 和 Android 源代码?

java - spring 存储库无法通过电子邮件找到