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

时间:2020-10-24 14:27:02

标签: git git-submodules

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

Q代表S1子模块的源仓库(换句话说,Q是最初创建{{ git submodule add ...中的1}}子模块。

出于这个问题的目的,您可以假设S1的{​​{1}}分支是其R1分支的直接后代。

此外,您可能会假设S1的{​​{1}}分支中的所有提交都来自localpatches,而master范围内的提交仅存在于{ {1}}。

现在,我还有一个单独的S1存储库master,它与Q完全不同。 (这是指master..localpatchesS1没有共同的提交,他们有不同的贡献者,它们的相关工作树是完全不同的,等等。)


我想知道向git添加子模块R2的最简洁方法,使其成为R1的{​​{1}}子模块的副本。特别是(1)R1的源存储库也应为R2; (2)S2应该有两个分支R2S1; (3)R1S2的{​​{1}}(分别为Q)分支中的提交应该相同。

(如果我错了,请纠正我,但是这些要求中的第一个(即S2的源仓库应该是master)反对仅仅通过创建localpatchesmaster中运行localpatches。)

(如果很重要,您可以假设S1回购已过时/已失效。这尤其意味着S2S2之间将来的分歧问题很无聊。)

1 个答案:

答案 0 :(得分:1)

一次性操作

  1. 像往常一样创建仓库R2
  2. 从Q git submodule add <path to Q> S2中添加子模块
  3. 当您进入子模块时,可以对其进行修改cd S2
  4. S1中的R1添加为远程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相同的提交。我展示了此解决方案是因为您提到到R1 / S1的链接对您而言并不重要。


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