如何将子模块从一个仓库复制到另一个仓库?

How to copy a submodule from one repo to another?

我有一个 git repo R1 和一个子模块 S1,后者有两个分支,masterlocalpatches

Q 代表 S1 子模块的源代码库(换句话说,Q 是最初创建 git submodule add ... 的参数S1 R1 中的子模块)。

出于这个问题的目的,您可以假设 S1localpatches 分支是其 master 分支的直接后代。

此外,您可以假设 S1master 分支中的所有提交都来自 Q,而 master..localpatches 范围内的提交仅存在在 S1.

现在,我还有一个单独的 git 存储库 R2,它与 R1 完全不同。 (我的意思是 R1R2 没有共同的提交,它们有不同的贡献者,它们相关的工作树完全不同,等等)


我想知道将子模块 S2 添加到 R2 的最简洁方法,使其成为 R1S1 子模块的副本。特别是,(1) S2 的源代码库也应该是 Q; (2) S2应该有两个分支,masterlocalpatches; (3) S1S2master (resp.localpatches) 分支中的提交应该相同。

(如果我错了请纠正我,但是这些要求中的第一个(即 S2 的源代码库应该是 Q)反对创建 S2通过 运行 git submodule add <S1's URL>R2.)

(万一重要,您可以假设 R1 回购是 obsolescent/defunct。这特别意味着 S1S2 没有实际意义。)

作为一次性操作

  1. 像往常一样创建回购 R2
  2. 从 Q 添加子模块 git submodule add <path to Q> S2
  3. 当你 cd 到一个子模块时你可以修改它 cd S2
  4. R1 中添加 S1 作为远程 git remote add S1 <path to R1>/S1
  5. 获取git fetch S1
  6. 创建分支git checkout -b localpatches S1/localpatches
  7. 也许移除 S1 遥控器 git remote remove S1

现在 S2 与 S1 有相同的提交。我展示了这个解决方案,因为你提到 link 到 R1/S1 对你来说并不重要。


如果您想多次执行此操作或想在 S1 和 S2 之间共享代码。最好创建一个 Q 的分支(甚至可以是本地的)并将您的分支作为远程添加到 S1 和 S2。