git 如何从包含本地子模块提交的本地存储库创建分支/工作树

vmjh9lq9  于 2022-12-10  发布在  Git
关注(0)|答案(1)|浏览(139)

流程很简单:

  • 我克隆了一个名为project的存储库,还克隆了另一个存储库addon,将其作为子模块嵌入到project中。
- project
--- addon
------ z.c
--- x.c
--- y.c
  • 我已经对addon中的一些文件做了修改。我已经将这些修改提交给了addon和超级项目project。但是我没有将它们推到任何地方--这些修改完全是本地的。
  • 现在,我想在另一个位置创建一个project的分支/工作树,命名为otherProject。这个新的工作树应该包含所有父级的文件,包括addon子模块的当前状态,保留其历史。
git worktree add -b otherProject path/to/otherProject HEAD

如何执行此操作?

目前,上面的命令并没有转移子模块,而是新工作树的addon文件夹是空的。
我尝试过的一些方法:

  • git submodule update --recursive不工作。当我在新的工作树中运行它时,它试图从原始服务器origin获取当前子模块提交,当然失败了,因为服务器没有我的本地addon提交。错误沿着:
error: Server does not allow request for unadvertised object 987e772b2...
fatal: Fetched in submodule path `addon`, but it did not contain  987e772b2...
  • git checkout --recurse-submodules看起来不工作。它没有返回任何错误,但当我运行git status -uno后,我得到这个:
Submodules changed but not updated:

Warn: addon doesn't contain commit 987e772b2...
  • 我尝试将.gitmodules中新工作树的URL更改为父存储库的本地路径,但这没有帮助--它仍然试图从远程服务器进行拉取。(Some answers似乎暗示可以从绝对本地路径作为URL创建子模块,尽管文档中根本没有提到这一点。)
  • 在新的工作树的addon文件夹中运行git checkout会用文件填充它--但这些文件是从远程服务器上获取的,它们不包含我的本地更改。
46scxncf

46scxncf1#

好了,我上次对remote-origins的评论让我更详细地检查了submodule update命令。看起来它接受了一个--reference选项,并在内部传递给任何潜在的clone调用。根据Git-URLs页面,这个选项显然可以接受一个本地路径。
因此,基本上,我可以在新的工作树otherProject中运行以下命令:

git submodule update --recursive --reference <Absolute-Local-Path-To-Parent-Submodule>

e.g.

git submodule update --recursive --reference C:/project/addon

... addon子模块直接从那里克隆出来,指向绑定到工作树HEAD的子模块提交。
到目前为止,一切看起来都很好。现在克隆的子模块有一个分离的HEAD,这很容易用git checkout -b newAddonBranchName修复。
我不知道这是否是“正确”的方法--如果有人有更好的建议,欢迎他们发表。

相关问题