合并两个存储库(原始项目和已更改的项目没有历史记录)

时间:2012-07-02 16:51:24

标签: git version-control merge git-svn

我有两个存储库:

  • Geith(大型开源项目)托管在github上
  • 我公司基于gephi的项目
7个月前,当我们的项目开始时,有人在github上拍摄了gephi项目的快照并将其保存到公司svn =>改变历史损失

现在我决定将我们的项目移动到git存储库并将更改与原始项目合并

我现在已经使用git-svn

从svn迁移了git资源库

我的文件没有超出项目开始时间的更改历史记录

我可以将存储库的初始状态映射到原始存储库的状态吗?换句话说,我想从特定版本开始将我们的更改应用于原始存储库。

更新

今天我发现了另一个障碍。架构优先:

enter image description here

  • 红色分支是原始项目

  • <alpha1><alpha2>是主要项目的插件提交(与<E' E'' E'''>中提交的代码无关)

  • <E'> <E''> <E'''>中添加了
  • 来自主项目(红色)存储库<E>的代码(在每个提交cca中,来自<E>的项目的三分之一)

我已将红色和蓝色存储库合二为一。在第二个模式我有所需的状态。是否有可能做到这一点? (例如,从<E' E'' E''>只提交一个提交(<E'>),然后将该提交标记为从分支<ABCD><alpha1 alpha2>合并

谢谢Julien的回复。这似乎非常有帮助。

2 个答案:

答案 0 :(得分:5)

免责声明:我现在对此进行了测试,看起来它的效果与预期相符(假设我当然理解正确)。但是,还有很多可能出错的地方。 绝对只在项目存储库的单独工作副本上尝试这一点,并确保在将其推送到任何地方之前检查所有内容。在执行此操作之前,请保留状态的完整目录备份。

所以我假设你有两个独立的存储库。原始项目(Gephi):

A---B---C---D---E
                ^ HEAD of Gephi

您的项目,其第一个修订版看起来与原始项目的最新版本相同:

E'---V---W---Y---...---Z
                       ^ HEAD of your project

(可能有一些分支,但这在这里并不重要。)

您希望拥有的内容(如果我理解正确的话)是:

A---B---C---D---E---V---W---Y---...---Z

您可以尝试以下方法。 再次,在您自己的独立工作树上执行此操作,并确保在将其推送到任何中央存储库之前一切正常!

在您自己的工作树的目录中,获取原始Gephi存储库的头部和对象:

git fetch /path/to/original/gephi

如果你还没有克隆Gephi存储库,你也可以指定github URL而不是本地文件系统路径。

这将导致当前工作树中出现以下情况:

A---B---C---D---E
                ^ FETCH_HEAD

E'---V---W---Y---...---Z
                       ^ HEAD

我们没有太多变化。目前,这两个元首并存并完全独立,但您现在可以从两个存储库访问这些对象,并可以尝试将它们组合起来。

我们现在想要丢弃E'(它应该与E相同),而是使E成为项目第一次提交的父级,即V.为此,您可以使用git filter-branch

git filter-branch -f --parent-filter 'test $GIT_COMMIT = <V> && echo "-p <E>" || cat'

分别用V和E的提交哈希值替换<V><E>。要查找这些内容,您可以git log检查项目的提交,并且,因为我们已经提取它们,git log FETCH_HEAD来检查Gephi的提交。

这将有效地将V直接连接到E。

如果事实证明原始Gephi存储库的头部(即最新提交)不是您的项目基础,这甚至可以工作,这意味着Gephi中有新的提交您没有(然而?)照顾。请确保,再次将<E>替换为基于您的更改的提交的哈希,的头部。

相反,请确保使用首次更改的哈希值替换<V>。也许您的存储库不包含与E相同的E',但第一次提交已包含对原始的更改。然后,第一个提交哈希将是您的<V>,而不是之后的那个。

总结最后几段:如果您的情况如下,上述命令也应该有效:例如:

A---B---C---D---E---F---G---H---I
                ^               ^ FETCH_HEAD
                point where your project branched off

V---W---Y---...---Z
^                 ^ HEAD
first change based on E

请确保使用在此上下文中有意义的提交哈希值。

答案 1 :(得分:1)

听起来您可能想要调查grafts(或可能是replacements) - 这些方法与filter-branchrebase的不同之处在于它们将元数据添加到更改存储库的可见状态,而不是重写历史记录以实际影响更改。当人们使用现有分支时,这非常有用,因为它可以避免从其下面更改历史记录。

在您的情况下,您需要为E'添加移植,并将E作为额外的父级。