Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/mercurial/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
从Git repo拉到Hg repo,Git repo是同一个项目,但失去了历史记录_Git_Mercurial_Hg Git - Fatal编程技术网

从Git repo拉到Hg repo,Git repo是同一个项目,但失去了历史记录

从Git repo拉到Hg repo,Git repo是同一个项目,但失去了历史记录,git,mercurial,hg-git,Git,Mercurial,Hg Git,我的设想如下 我从中克隆的项目最初是使用Mercurial进行版本控制的,我克隆了原始的repo及其所有历史。 在某个特定的时间点,项目所有者决定迁移到GitHub,但在迁移过程中丢失了所有的历史记录,因此新回购协议虽然是旧项目的延续,但实际上是从0版重新开始 我想坚持Hg,Hg Git显然会允许我从Git回购中退出,但我不知道如何将Hg回购的头和Git回购的尾粘在一起,这样我就可以像以前一样继续定期更新。 Git中与Hg回购协议头部匹配的实际提交并不是第一次提交,所以它不是尾部的尖端 我认为h

我的设想如下

我从中克隆的项目最初是使用Mercurial进行版本控制的,我克隆了原始的repo及其所有历史。 在某个特定的时间点,项目所有者决定迁移到GitHub,但在迁移过程中丢失了所有的历史记录,因此新回购协议虽然是旧项目的延续,但实际上是从0版重新开始

我想坚持Hg,Hg Git显然会允许我从Git回购中退出,但我不知道如何将Hg回购的头和Git回购的尾粘在一起,这样我就可以像以前一样继续定期更新。 Git中与Hg回购协议头部匹配的实际提交并不是第一次提交,所以它不是尾部的尖端

我认为hg convert和--patchemap可能有用,但我读得越多,它对我来说就越不像是一个解决方案

有人能就我如何做到这一点提出建议吗


更新
只是想告诉那些可能会尝试做类似事情的人,我最终成功地实现了我想要的结果,但这是一条漫长而曲折的道路,最终证明hg转换和拼接地图是答案

  • 我使用HGGit插件从Github中删除了GitRepo
  • 然后我将其克隆到一个新的repo中,并使用Hg pull--force
    现在我有一个回购协议,它有两个不同的发展分支,就回购协议而言,它们没有共同的祖先,我将把它称为hydra
  • 使用hg convertpatchemap我将历史中匹配点处的分支连接到一个新的repo中,然后运行hg strip以去除多余的位
  • 然而,诀窍是,原始的Git回购协议将被更新,我希望能够将新的更改引入到这一联合回购协议中。
    解决方案是什么?批处理文件。
    是的,你听对了,批处理文件。
    解决方案实际上是一组3,首先从Github拉到只持有Git回购的回购。第二个从Git回购协议中提取到hydra(汞源不会改变,所以我不需要再次提取)。第三,重新运行hg convert命令,以便使用来自hydra的新信息更新加入的回购

  • 这很不愉快,冗长,设置起来有点像噩梦,但它现在运行得很干净,我的最终回购是一个可预测且合理的大小。

    从未尝试过这一点,但在桥接回购的/.hg中操作git映射文件可能会行得通。我想这样试试:

  • 假设Hg回购的顶端是Git回购的根
  • 通过hg-Git克隆Git-repo,只克隆到根目录(这在Git中是可能的,对吧?)
  • 将所有提交从原始Hg repo拉入Hg git克隆
  • 去掉单独的根,但是记下这个根的完整散列
  • 记下HgRepo提示的完整散列(现在也是HgGit克隆的提示)
  • 编辑/.hg/git映射文件。它应该只包含一个条目,其一侧(应该在右边)有单独的根哈希。将此哈希替换为提示之一。不要替换另一侧(左),因为它是对应Git提交对象的哈希
  • “汞拉”。如果这个理论成立,这将把新的Git节点添加到旧的Hg节点上

  • 这可能完全是胡说八道,但至少HgGit的较旧(“dumber”)版本只是通过这个映射文件确定了必要的git对象。所以值得一试…

    听起来它可能会奏效,我明天会试一试,看看效果如何。谢谢原则上它是有效的。我不知道如何从Git中只提取根,所以我提取了很多,但使用strip也不是问题。然而,当我用mapfile连接所有内容并再次从Git中提取时,磁盘上的repo的大小增加了5倍,尽管我只提取了200个修订版,但没有考虑到大小的增加。一个克隆人的大小只有我预期的一半,但仍然是我预期的两倍。你的答案绝对有效,结果证明我想做的其实不是一个可行的解决方案。