显然,添加具有子模块的存储库的子树将破坏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
此脚本在做什么:
[进一步考虑,很清楚问题出在哪里:子树机制已经将子树的子模块引用添加到树的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
...但是,如果子树有很多子模块,这会有些痛苦。有更好的方法吗?
据我所读的文档和源代码... Git子树与Git子模块完全分开,并且不会主动管理子树项目本身可能包含的任何子模块。您已经发现,对于.gitsubmodules
的功能至关重要的git submodule init
,需要在“主”存储库的根目录中维护(因为缺少更好的用语)。
经过进一步考虑,很清楚问题出在哪里:子树机制已将子树的子模块引用添加到submod,以树,但是.gitmodules元数据保留在subtree / .gitmodules中,不是顶级.gitmodules,这意味着git子模块是init失败。如果我们将subtree / .gitmodules的内容复制到.gitmodules,相应地调整所有路径,即可解决问题...我强烈建议不要混合使用这些功能。