5

我有两个存储库:

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

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

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

我现在已经使用 git-svn 从 svn 迁移了 git 存储库

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

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

更新:

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

在此处输入图像描述

  • 红色分支是原始项目

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

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

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

谢谢朱利安的回复。这似乎很有帮助。

4

2 回答 2

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

只要确保使用在这种情况下有意义的提交哈希。

于 2012-07-02T17:27:23.443 回答
1

听起来您可能想要调查移植(或可能的替换)——这些方法的不同之处filter-branch在于rebase它们添加元数据以更改存储库的可见状态,而不是重写历史以实际影响更改。当您有人使用现有分支时,这很有用,因为它避免了从它们下面更改历史。

在您的情况下,您需要为 增加一个嫁接,作为额外的父母E'给予。E

于 2012-07-03T12:47:41.247 回答