流程很简单:
- 我克隆了一个名为
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
会用文件填充它--但这些文件是从远程服务器上获取的,它们不包含我的本地更改。
1条答案
按热度按时间46scxncf1#
好了,我上次对remote-origins的评论让我更详细地检查了
submodule update
命令。看起来它接受了一个--reference
选项,并在内部传递给任何潜在的clone
调用。根据Git-URLs页面,这个选项显然可以接受一个本地路径。因此,基本上,我可以在新的工作树
otherProject
中运行以下命令:...
addon
子模块直接从那里克隆出来,指向绑定到工作树HEAD的子模块提交。到目前为止,一切看起来都很好。现在克隆的子模块有一个分离的HEAD,这很容易用
git checkout -b newAddonBranchName
修复。我不知道这是否是“正确”的方法--如果有人有更好的建议,欢迎他们发表。