从Git repo拉到Hg repo,这是同一个项目,但已经失去了历史

时间:2013-06-26 16:52:13

标签: git mercurial hg-git

我的情况如下。

我克隆的项目最初是使用Mercurial进行版本化的,我有一个原始回购的克隆及其历史。 在某个时间点,项目的所有者决定搬到GitHub但是已经失去了移动中的所有历史,所以这个新的回购,虽然它是旧项目的延续,但实际上是从修订版0重新开始。

我想坚持使用Hg,Hg-Git显然会允许我从Git回购中获取,但我不知道该怎么办就是将Hg回购的头部与尾部粘在一起Git repo所以我可以继续像以前那样继续定期更新。 Git中与Hg repo的头部匹配的实际提交不是第一次提交,因此它不是尾部的尖端。

我认为hg convert和--splicemap可能有用,但我读的越多,它对我来说就越不合适。

任何人都可以就如何实现这一目标提出任何建议吗?


更新
只是为了那些可能尝试做类似事情的人的信息,我终于设法达到我想要的结果,但这是一条漫长而曲折的道路,事实证明,hg convert和splicemap毕竟是答案。

  1. 我用hg-git插件从Github下载了Git repo。
  2. 然后我将其克隆到一个新的回购中,并使用 hg pull --force 拉入相关但已断开连接的Hg回购内容。
    所以现在我有一个有两个不同发展分支的回购,就回购而言,没有共同的祖先,我将把它称为 hydra
  3. 使用 hg convert splicemap 我将历史记录中匹配点的分支加入到新的仓库中,然后运行 hg strip 摆脱不必要的流浪。
  4. 然而,诀窍是原来的Git仓库将会更新,我希望能够对这个联合仓库进行新的更改。
    解决方案?批处理文件 是的,你听到了正确的批处理文件 解决方案实际上是一组3,首先从Github拉到刚刚拥有Git仓库的仓库。第二次从Git回购拉到九头蛇(Hg来源不会改变所以我不需要再次拉动它)。第三次重新运行 hg convert 命令,以便用来自九头蛇的新信息更新已加入的回购。
  5. 这是令人不快的,它啰嗦,设置起来有点噩梦,但它现在干净利落,我的最终回购是可预测的合理尺寸。

1 个答案:

答案 0 :(得分:3)

从未尝试过这个,但是也许可以在bridge-repo的/.hg中操作git-mapfile。我会这样试试:

  1. 让我们说Hg repo的提示是Git repo的根。
  2. 只通过hg-git克隆Git repo到root(这可能与Git一致,对吧?)。
  3. 将所有提交从原始Hg repo中拉入hg-git clone。
  4. 删除单根,但记下此根的完整哈希值。
  5. 记下Hg repo提示的完整哈希值(现在也是hg-git克隆的提示)。
  6. 编辑/.hg/git-mapfile。它应该只包含一个条目,一边是单根的哈希(应该在右边)。将此哈希替换为提示之一。不要替换另一侧(左侧),因为它是相应Git提交对象的哈希值。
  7. “hg pull”。如果理论成立,这将把新的Git节点添加到旧的Hg节点上。
  8. 可能完全是胡说八道,但至少hg-git的旧版本(“dumber”)只是通过这个地图文件确定了必要的git对象。所以值得一试......