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

Ult*_*ter 5 git version-control merge git-svn

我有两个存储库:

  • Geith(大型开源项目)托管在github上
  • 我公司的项目基于gephi

7个月前,当我们的项目开始时,有人在github上拍摄了gephi项目的快照并将其保存到公司svn =>更改历史记录丢失

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

我现在有git存储库从svn迁移到git-svn

我的文件在项目开始之后没有更改历史记录

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

更新:

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

在此输入图像描述

  • 红色分支是原始项目

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

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

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

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

Jul*_*ter 5

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

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

A---B---C---D---E
                ^ HEAD of Gephi
Run Code Online (Sandbox Code Playgroud)

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

E'---V---W---Y---...---Z
                       ^ HEAD of your project
Run Code Online (Sandbox Code Playgroud)

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

你想拥有的(如果我理解正确的话)是:

A---B---C---D---E---V---W---Y---...---Z
Run Code Online (Sandbox Code Playgroud)

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

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

git fetch /path/to/original/gephi
Run Code Online (Sandbox Code Playgroud)

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

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

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

E'---V---W---Y---...---Z
                       ^ HEAD
Run Code Online (Sandbox Code Playgroud)

我们没有改变很多.目前,这两个元首并行地完全独立地共存,但您现在可以访问两个存储库中的对象,并可以尝试将它们组合在一起.

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

git filter-branch -f --parent-filter 'test $GIT_COMMIT = <V> && echo "-p <E>" || cat'
Run Code Online (Sandbox Code Playgroud)

更换<V>以及<E>由分别提交伏且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
Run Code Online (Sandbox Code Playgroud)

只需确保使用在此上下文中有意义的提交哈希.