我有一个顶级的项目,有大约10个子模块,和一些嵌套的子模块。
./top-project/
./top-project/module-a
./top-project/module-b
...
字符串
一些子模块有一个经典的url,如url = git:software/module-a
,其他的有一个相对于远程top-project的url,如url = ../module-b
。top-project url是url = git:software/top-project
。
我想创建一个工作树副本的顶级项目,及其所有的子模块。
git worktree add -f ../top-project-v2
型
但是我找不到一种方法让子模块指向它们原来的路径,我希望top-project-v2/module-a
git指向top-project/module-a
,而不是克隆一个全新的模块-a。
如果执行cd top-project-v2; git submodule upate --init --recursive
,命令会成功,但子模块不会链接到顶级项目子模块。
如果我执行git checkout --recurse-submodules origin/v2
,我会得到一个错误:
git checkout --recurse-submodules origin/v2
fatal: not a git repository: ../../top-project/.git/worktrees/top-project-v2/modules/module-a
fatal: could not reset submodule index
型
有没有办法做到这一点?
2条答案
按热度按时间busg9geu1#
如果子模块不是可选的,或者没有足够便宜的方法来获取,那么就把子模块历史作为分支携带到主仓库中,并为它们添加
git submodule init; git worktree add
。daolsyd02#
不幸的是,仍然不支持子模块。至少对于当前版本(2.43.0),手册页仍然告诉它的支持是“不完整的”:
多重 checkout 通常仍处于试验阶段,对子模块的支持还不完整。不建议对超级项目进行多重 checkout 。
I've created a
post-checkout
hook可以为超级仓库添加一个工作树,但是由于它不是在例如git submodule update
的情况下触发的,所以它可能不工作。你可以随时使用git checkout @
触发钩子。短期使用:
super-worktree.post-checkout --install
。git worktree add <path>
创建一个工作树。cd
放入工作树并执行git submodule update && git checkout @
。