如何从不同的分支中引入子模块?

How can I bring submodule from different branch?

我在不同的分支上有一个子模块 (branch-with-submodule) 而目前在一个没有子模块的分支上 (branch-without-submodule) 就这样。

---(Commit that adds submodule)-A-B-[branch-with-submodule]
 \
  --C-[branch-without-submodule*]

我想要当前分支的子模块怎么办?我想我可以 cherry-pick 添加子模块的提交,但是如果该提交中有许多其他修改(比如,有多个子模块)并且我只需要一个特定的子模块怎么办?

有没有办法不用再次手动添加 git 子模块就可以做到这一点?也许使用 checkout?

你可以做一个变基,这样你将在 A 之上获得 C 提交 f,B 提交在你名为 branch-without-submodule 的分支上:

  1. git 结帐分支与子模块
  2. git 获取最新更新
  3. git 签出无子模块的分支
  4. git 重新设置子模块分支

git cherry-pick 是您最好的选择,尽管这是有争议的。

如果这不是一个选项,因为提交是脏的,那么总是有 split it into several different commits 的选项。顺便说一句,这正是您应该经常提交并推送一个的原因。提交是免费的,并且很容易压缩它们,但拆分它们需要修改历史记录。

git merge 也是一种可行的方式,但我相信你不想去那里,因为你只想要一个 .gitmodules 添加。所以,变基也是不行的。

最后一点:如果你不能挑选,因为那个提交有一个你需要的子模块和其他你不想要的文件,你可能总是 cherry-pick only certain files。不过,由于这些是子模块,我不是 100% 它会工作。