git - 从同一个项目但丢失了历史记录的 Git 仓库中 pull Hg 仓库

标签 git mercurial hg-git

我的场景如下。

我从中克隆的项目最初是使用 Mercurial 进行版本控制的,我有一个包含所有历史记录的原始存储库的克隆。 在某个时间点,项目所有者决定迁移到 GitHub,但在迁移过程中丢失了所有历史记录,因此这个新仓库虽然是旧项目的延续,但实际上是从修订版 0 重新开始。

我想坚持使用 Hg,而 Hg-Git 显然允许我从 Git 仓库中提取,但我不知道该怎么做是将 Hg 仓库的头部与Git repo 这样我就可以像以前一样继续 pull 下定期更新。 Git 中与 Hg 存储库的头部匹配的实际提交不是第一次提交,因此它不是尾部的尖端。

我认为 hg convert 和 --splicemap 可能会有用,但我读得越多,它就越不适合我。

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


更新
仅供可能尝试做类似事情的任何人引用,我终于设法实现了我想要的结果,但这是一条漫长而曲折的道路,事实证明 hg convert 和 splicemap 才是答案。

  1. 我使用 hg-git 插件从 Github 上下载了 Git 仓库。
  2. 然后我将其克隆到一个新的存储库中,并使用 hg pull --force pull 入相关但断开连接的 Hg 存储库内容。
    所以现在我有一个包含 2 个不同开发分支的代码库,就代码库而言它们没有共同的祖先,我将把它称为 hydra
  3. 使用 hg convertsplicemap 我将历史匹配点的分支加入到一个新的 repo 中,然后运行 ​​hg strip摆脱杂散的不必要的部分。
  4. 然而,诀窍是原始 Git 存储库将被更新,我希望能够将新的更改引入到这个联合存储库中。
    解决方案?批处理文件。
    是的,你没听错,批处理文件。
    该解决方案实际上是一组 3 个,首先从 Github pull 到只包含 Git 存储库的存储库。第二次从 Git 存储库中提取到 hydra(Hg 源不会改变,所以我不需要再次从中提取)。第三次重新运行 hg convert 命令,以便它使用来自 hydra 的新信息更新加入的 repo。

它令人不快,冗长且设置起来有点像噩梦,但它现在运行良好,我的最终 repo 是可预测且合理的大小。

最佳答案

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

  1. 假设 Hg 存储库的提示是 Git 存储库的根。
  2. 通过 hg-git 将 Git 存储库克隆到根目录(这可以用 Git 实现,对吧?)。
  3. 将原始 Hg 存储库中的所有提交 pull 入 hg-git 克隆。
  4. 去掉单独的根,但记下这个根的完整哈希值。
  5. 记下 Hg 存储库提示的完整哈希值(现在也是 hg-git 克隆的提示)。
  6. 编辑/.hg/git-map 文件。它应该只包含一个条目,在一侧(应该在右边)有唯一根的散列。将此散列替换为提示之一。不要替换另一边(左),因为它是相应 Git 提交对象的哈希值。
  7. “ Mercurial pull ”。如果理论成立,这会将新的 Git 节点添加到旧的 Hg 节点上。

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

关于git - 从同一个项目但丢失了历史记录的 Git 仓库中 pull Hg 仓库,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17326041/

相关文章:

mercurial - 带有 Mercurial 的 Visual FoxPro?

django - 如何使用 Mercurial 将文件夹与现有 Heroku 应用程序链接

git - 推送到 Heroku 时如何修复 "error: src refspec master does not match any"错误?

git - Hg-Git:如何同时推送到 Github 和 Bitbucket?

Mercurial:R 为 'hg status' ,如何提交?

git - Mercurial : "invalid-email-address" at GitHub

git - Visual Studio 2015 : Git Diff Tool Window is empty

git - 本地 git checkin ——从主存储库中 stash ?

没有/a/b 的 Git diff 补丁?