如何从没有子模块的分支中检出带有子模块的分支

8

我在本地机器上有三个分支:

  • master
  • feature-branch-with-submodule
  • feature-branch-without-submodule

原来没有子模块的分支曾经有一个子模块,我按照 这篇 SO 帖子 的指示删除了子模块。但是我不想从 masterfeature-branch-with-submodule 中删除子模块。

然而,现在我已经完成了对 feature-branch-without-submodule 的操作,我想切换到 feature-branch-with-submodule。所以我执行 git checkout 命令,但是出现了以下错误:

fatal: not a git repository: src/vendor/mysubmodule/../../../../../.git/modules/src/vendor/mysubmodule

如何修复该问题,使带有子模块的分支有它,而没有子模块的分支没有它,并且我可以自由地使用git checkout在两个分支之间切换?


https://stackoverflow.com/search?q=%5Bgit-submodules%5D+switch+branches - phd
如果 git checkout --recurse-submodules 不够用,你可以考虑使用像这些post-checkout 钩子。 - phd
2个回答

6

过去一两天,我一直在思考问题所在。这里有一个链接,是我找到的最接近(而且真的很糟糕)的答案:

检出具有不同子模块的分支无法工作

为了快速回答:

Supposing, for example, branch master has submodule A and branch alpha has submodule B.

To properly checkout master you should, essentially
git submodule deinit .
git checkout master
git submodule update --init --recursive

To go back to alpha, again
git submodule deinit .
git checkout alpha
git submodule update --init --recursive

我曾经遇到过非常类似的问题:需要在带有子模块的分支和不带子模块的分支之间切换。你的答案让我找对了方向。 当我有机会时,我会提供一些澄清编辑(在SO上有一个完整的“建议编辑队列”,我不太清楚是什么)。 - jmon12

0

从没有子模块的功能到有子模块的功能

如果您已经完全删除了子模块(即包括 .git/modules/path/to/submodule 中的缓存),那么这里有一种看起来可行的方法。

(我假设您正在使用干净的工作树。也就是说,一开始没有任何修改过的文件。)

rm -rf <path> # Optional: if you have files in the path.
git submodule add [--name <name>] <repository> <path>
git submodule deinit -f <path>
git checkout -f feature-branch-with-submodule
  1. 删除子模块路径中现有的文件。

  2. 重新引入已删除的子模块。目标是将 .git/modules/<name> 文件夹初始化到仓库,以便 git merge 正常工作。您需要:

    • 子模块的仓库
    • 子模块的路径
    • --name 传递的名称(如果与路径相同,则不需要)

    您可以通过查看 .gitmodules 的差异来找到它们。

  3. 取消初始化子模块。

  4. 强制检出!

从带子模块的功能分支返回到不带子模块的功能分支

要返回到原始状态,请检出到不带子模块的功能分支,然后运行以下命令以删除缓存文件:

rm -rf .git/modules/<name>

这样做是为了将来您可以使用相同的名称git submodule add添加子模块。

此外,如果您想要完全删除子模块文件夹,请运行:

rm -rf <path>

如果子模块文件夹中已经存在文件,则不需要此步骤。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接