如何使用嵌套在子树中的子模块的git repo

时间:2017-07-31 18:16:21

标签: 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

这个脚本正在做的是:

  1. 创建repo submod
  2. 创建一个具有submod
  3. 子模块引用的repo子树
  4. 创建一个具有子树
  5. 子树引用的repo top

    经过进一步考虑,很清楚问题是什么:子树机制已将子树的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
    

    ...但是如果子树有很多子模块会有点痛苦。有更好的方法吗?

1 个答案:

答案 0 :(得分:2)

据我所知,阅读文档和源代码... Git子树与Git子模块完全独立,并且不会主动管理子树项目本身可能包含的任何子模块。 / p>

您发现,对于.gitsubmodules的功能至关重要的git submodule init,需要保留在“主”存储库的根目录中(因为缺少更好的术语)。 / p>

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

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