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)
该脚本正在执行的操作是:
经过进一步考虑,很清楚问题出在哪里:子树机制已将子树对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)
...但是如果子树有很多子模块,那会有些痛苦。有一个更好的方法吗?
从阅读文档和源代码来看,Git 子树与 Git 子模块完全分开,并且不会主动管理子树项目本身中可能包含的任何子模块。
正如您所发现的,.gitmodules对于 的功能至关重要git submodule init,需要维护在“主”存储库的根目录中(因为缺乏更好的术语)。
进一步考虑,问题出在哪里就很清楚了:子树机制已经将子树的子模块对 submod 的引用添加到了树中,但是 .gitmodules 元数据仍然保留在 subtree/.gitmodules 中,而不是顶层 .gitmodules 中,这意味着 git子模块初始化失败。如果我们将 subtree/.gitmodules 的内容复制到 .gitmodules ,相应地调整所有路径,就可以解决问题......
我强烈建议不要混合这些功能。
| 归档时间: |
|
| 查看次数: |
424 次 |
| 最近记录: |