如何将git repo与嵌套在子树中的子模块一起使用

Edw*_*ang 6 git git-submodules git-subtree

显然,添加具有子模块的存储库的子树将破坏git submodule init。这是一个重现该问题的脚本:

#!/bin/sh
set -ex

mkdir submod
cd submod
git init
touch foo
git add foo
git commit -asm "This is a submodule"
cd ..

mkdir subtree
cd subtree
git init
git submodule add `realpath ../submod` submod
git commit -asm "This has reference to submodule"
cd ..

mkdir top
cd top
git init
touch bar
git add bar
git commit -asm "Dummy commit so HEAD resolves correctly"
git subtree add --prefix=subtree `realpath ../subtree` master

# This fails!
git submodule init
Run Code Online (Sandbox Code Playgroud)

该脚本正在执行的操作是:

  1. 创建一个仓库remod
  2. 创建一个回购子树,该子树具有对submod的子模块引用
  3. 创建一个具有子树引用子树的仓库顶部

经过进一步考虑,很清楚问题出在哪里:子树机制已将子树对submod的子模块引用添加到树中,但是.gitmodules元数据保留在中subtree/.gitmodules,而不是顶层.gitmodules,这意味着git submodule init失败。如果我们将的内容复制subtree/.gitmodules.gitmodules,相应地调整所有路径,就可以解决问题...

[submodule "submod"]
    path = subtree/submod
    url = /Users/ezyang/Dev/labs/git-subtree-submod/submod
Run Code Online (Sandbox Code Playgroud)

...但是如果子树有很多子模块,那会有些痛苦。有一个更好的方法吗?

Ant*_*ean 5

从阅读文档和源代码来看,Git 子树与 Git 子模块完全分开,并且不会主动管理子树项目本身中可能包含的任何子模块。

正如您所发现的,.gitmodules对于 的功能至关重要git submodule init,需要维护在“主”存储库的根目录中(因为缺乏更好的术语)。

进一步考虑,问题出在哪里就很清楚了:子树机制已经将子树的子模块对 submod 的引用添加到了树中,但是 .gitmodules 元数据仍然保留在 subtree/.gitmodules 中,而不是顶层 .gitmodules 中,这意味着 git子模块初始化失败。如果我们将 subtree/.gitmodules 的内容复制到 .gitmodules ,相应地调整所有路径,就可以解决问题......

我强烈建议不要混合这些功能。

  • 老实说,我将“.gitmodules”文件从子树根复制到根存储库根,并编辑了子模块的名称和路径,它工作得很好。我不明白有什么大惊小怪的。 (2认同)