2012-07-02 42 views
5

我有两个库:合并两个仓库(原项目和变更项目没有历史)

  • Gephi(大开源项目)托管在GitHub上基于gephi我公司
  • 项目

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

现在我决定将我们的项目的Git仓库,并与原项目

我现在已经git仓库从SVN迁移使用git - svn的

我的文件,不具有改变历史超越时间合并更改,当我们的项目启动

我可以将我们资源库的初始状态映射到原始资源库的状态吗?换句话说,我想开始通过特定版本来修改原始存储库。

更新:

今天,我发现了另一个障碍。模式第一:

enter image description here

  • 红色分公司是原项目

  • <alpha1><alpha2>是插件主体工程的提交(不相关的<E' E'' E'''>代码COMMITED)

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

我已经取得红色和蓝色的资料库合为一体。在第二个架构我有所需的状态。是否有可能做到这一点? (例如,从<E' E'' E''>做只是一个承诺(<E'>),然后标记该犯为来自分支机构<ABCD><alpha1 alpha2>合并)

感谢您朱利安你的回应。这似乎很有帮助。

回答

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),而是使电子项目的第一次提交的父,这是五,要做到这一点,你可以用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 

只要确保使用commit哈希,在这种情况下才有意义。

+0

我刚刚测试过这个,它似乎工作(所以我更新了我的警告)。我仍然绝对建议你在一次性工作树上进行试验并进行完整备份。很容易让'filter-branch'语句错误,或混淆哈希! –

+0

如果本地项目有多个分支,或者历史上有任何合并,'git rebase'不是正确的工具,因为它会使历史线性化。改用'filter-branch'。 –

+0

谢谢。这是我原来的,但我认为rebase有更简单的语法。我恢复了我的更改,现在只是再次提到了filter-branch。 –

1

这听起来像你可能需要调查grafts(或可能replacements) - 这些方法从该filter-branchrebase不同,因为它们添加元数据修改资料库的可见状态,而不是改写历史实际效果改变。这在您使用现有分支的人员时非常有用,因为它避免了在他们之下更改历史记录。

对于您的情况,您希望为E'添加移植,并将E作为额外的父项。

+0

我会推荐git替换移植 - 替换是引用,所以它们可以在库之间同步(使用适当的refspec)。 –

+0

是的,在很多情况下都是如此。然而,问题描述听起来像刚刚开始的git仓库(“现在我决定移动我们的项目[...] /我现在有git仓库”),并且使用新的仓库,我更喜欢实际的重写而不是其他的元数据那会徘徊直到时间的尽头。 –