2017-05-19 106 views
0

我想建立一些坚实的规则,我们可以使用这些规则逐步将多个回购合并为单个回购。我之前做过这个,但只是一个简单的例子。如何合并两个存储库

我的出发点是this article

在我们的案例中,我们已经(进化)六个左右的回购,几个月前我将其中一个合并为一个新的,最终我们希望一切都在这个新的,而不会丢失历史。

让我强调我们正在Github上讨论一个组织账户,所有回购都是私人的,都是这些回购的分支。

我看到的挑战 - 在一般情况下 - 其他人已经分叉这些回购,并且也可能在基本回购库中不存在分支。

因此,如果我简单地将一个基本回购合并到另一个基本回购中,原始回购的分叉变得无效,并且它们的内容(仅在分叉上存在的提交)变得不可用。

另外 - 没有在那篇文章中讨论过 - 是多分支机构的问题,如果源回购(从合并)有很多分支机构,这些分支机构必须当所有的说和做完,保留或存在于合并回购。

那么如何在这个一般情况下进行?顺便说一句,我们使用Smartgit来完成我们大部分的git工作。

+0

除非这里合并意味着重写相关的历史,那么为什么叉会变得无法使用?里面的提交和合并到你的最终版本库一样有效,因为它们在原来的分支中。 –

+0

不是那篇文章中概述的过程的粉丝。它以完成分支工作的目录结束。唯一有意义的是,如果您正在合并的回购是独立的项目 - 在这种情况下,请将它们保存在单独的回购中。 –

回答

1

我认为你的一些担忧是基于对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_forkfeature_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-forkfork-of-dept-B-fork之间的映射规则将不再是正确的。但这并不糟糕;至少历史是在那里,你已经离开了分支机构(尽管也许有一个新的名字)。 (跟踪信息的重新映射的唯一方法,顺便说一句,如果你知道总是从每个分支,具有相同名称的分支可以合并在一起,以在新的回购中创建该分支的名称,而不管什么组合你的叉子有那个分支。)

(你可以告诉你是否真的避免了所有的头痛;如果是的话,你将能够干净地推动任何分支到任何远程的相应分支(如果存在的话)没有--force/-f选项。)

无论如何,一旦一切都反映在当地的分支机构你可以

cd .. 
git clone --mirror repo-I-just-made new-origin 

创建一个合适的原点回购

+0

我应该注意根据你的描述,我假设所有的回购共享*一些*共同的历史 - 一个是另一个叉子等。如果这不是真的,那么将所有对象提取到一个回购将创建一个多根据回购。这并不一定是坏事,但如果/当您尝试合并这些历史记录时,需要进行特殊处理。 –