git 使用子模块为项目创建工作树

tcomlyy6  于 12个月前  发布在  Git
关注(0)|答案(2)|浏览(112)

我有一个顶级的项目,有大约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


有没有办法做到这一点?

busg9geu

busg9geu1#

如果子模块不是可选的,或者没有足够便宜的方法来获取,那么就把子模块历史作为分支携带到主仓库中,并为它们添加git submodule init; git worktree add

daolsyd0

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 @

相关问题