我认为你的一些担忧是基于对git如何组织其信息的误解。不过,我同意,一个坚实的,可重复的计划将是一个非常好的主意。
第一件事情:您可以收集每个回购商品中的所有商品,并自动合并重叠商品和所有商品,只需通过对右边的商品进行提取操作即可。
git init
git remote add origin
git remote add dept_A_fork
git remote add dept_B_fork
git fetch --all
现在你有一个本地回购,每个分支从每个远程。您有origin/master
,dept_A_fork/master
,dept_B_fork/master
。如果只有dept_B_fork
有feature_XYZ
分支,则您有dept_B_fork/feature_XYZ
。
这些分支的每一个都有完整的历史记录。如果他们共享历史记录,他们已经共享了所有常见的对象(包括提交)。如果有人分叉dept_B_fork
,他们可以将这个新回购作为一个遥控器重新命名,他们将找到他们需要提供其本地分支根源的上游历史记录。
从那里你需要的是约定。你想对所有回购有分支机构的情况做什么?将它们合并在一起,并使“本地”参考?你当然可以。可能会涉及很多冲突解决和测试。
如果某个分支只出现在某个仓库中,那么该怎么办?你可能只是离开远程裁判,但假设这将是一个真正的远程,当你完成我想出一种方法来重新映射到本地分支的一切。所以也许远程参考refs/remote/dept_B_fork/custom_branch
成为本地参考refs/heads/dept_B_fork/custom_branch
(在那里有一点点命名空间)。
因为您担心您的叉子的叉子并保持其有效,因此您的基本规则是请勿转换任何东西。不要樱桃挑选。不要使用filter-branch
。不要做南瓜合并。不要做任何会以任何方式移动任何裁判,以致它不再达到它曾经达成的承诺。
(其中的一些规则,可以说是矫枉过正,如果你真的知道你在做什么,而是遵循所有这些,你应该没有问题。)
这并不意味着没有人曾经将有头痛。他们必须弄清楚如何将他们的跟踪信息映射到你的新超级远程设备,因为dept-B-fork
和fork-of-dept-B-fork
之间的映射规则将不再是正确的。但这并不糟糕;至少历史是在那里,你已经离开了分支机构(尽管也许有一个新的名字)。 (跟踪信息的重新映射的唯一方法,顺便说一句,如果你知道总是从每个分支,具有相同名称的分支可以合并在一起,以在新的回购中创建该分支的名称,而不管什么组合你的叉子有那个分支。)
(你可以告诉你是否真的避免了所有的头痛;如果是的话,你将能够干净地推动任何分支到任何远程的相应分支(如果存在的话)没有--force
/-f
选项。)
无论如何,一旦一切都反映在当地的分支机构你可以
cd ..
git clone --mirror repo-I-just-made new-origin
创建一个合适的原点回购
除非这里合并意味着重写相关的历史,那么为什么叉会变得无法使用?里面的提交和合并到你的最终版本库一样有效,因为它们在原来的分支中。 –
不是那篇文章中概述的过程的粉丝。它以完成分支工作的目录结束。唯一有意义的是,如果您正在合并的回购是独立的项目 - 在这种情况下,请将它们保存在单独的回购中。 –