我的场景如下。
我从中克隆的项目最初是使用 Mercurial 进行版本控制的,我有一个包含所有历史记录的原始存储库的克隆。 在某个时间点,项目所有者决定迁移到 GitHub,但在迁移过程中丢失了所有历史记录,因此这个新仓库虽然是旧项目的延续,但实际上是从修订版 0 重新开始。
我想坚持使用 Hg,而 Hg-Git 显然允许我从 Git 仓库中提取,但我不知道该怎么做是将 Hg 仓库的头部与Git repo 这样我就可以像以前一样继续 pull 下定期更新。 Git 中与 Hg 存储库的头部匹配的实际提交不是第一次提交,因此它不是尾部的尖端。
我认为 hg convert 和 --splicemap 可能会有用,但我读得越多,它就越不适合我。
任何人都可以就如何实现这一目标提供任何建议吗?
更新
仅供可能尝试做类似事情的任何人引用,我终于设法实现了我想要的结果,但这是一条漫长而曲折的道路,事实证明 hg convert 和 splicemap 才是答案。
- 我使用 hg-git 插件从 Github 上下载了 Git 仓库。
- 然后我将其克隆到一个新的存储库中,并使用 hg pull --force pull 入相关但断开连接的 Hg 存储库内容。
所以现在我有一个包含 2 个不同开发分支的代码库,就代码库而言它们没有共同的祖先,我将把它称为 hydra。 - 使用 hg convert 和 splicemap 我将历史匹配点的分支加入到一个新的 repo 中,然后运行 hg strip摆脱杂散的不必要的部分。
- 然而,诀窍是原始 Git 存储库将被更新,我希望能够将新的更改引入到这个联合存储库中。
解决方案?批处理文件。
是的,你没听错,批处理文件。
该解决方案实际上是一组 3 个,首先从 Github pull 到只包含 Git 存储库的存储库。第二次从 Git 存储库中提取到 hydra(Hg 源不会改变,所以我不需要再次从中提取)。第三次重新运行 hg convert 命令,以便它使用来自 hydra 的新信息更新加入的 repo。
它令人不快,冗长且设置起来有点像噩梦,但它现在运行良好,我的最终 repo 是可预测且合理的大小。
最佳答案
从未尝试过,但也许可以在 bridge-repo 的/.hg 中操作 git-mapfile。我会这样尝试:
- 假设 Hg 存储库的提示是 Git 存储库的根。
- 通过 hg-git 将 Git 存储库克隆到根目录(这可以用 Git 实现,对吧?)。
- 将原始 Hg 存储库中的所有提交 pull 入 hg-git 克隆。
- 去掉单独的根,但记下这个根的完整哈希值。
- 记下 Hg 存储库提示的完整哈希值(现在也是 hg-git 克隆的提示)。
- 编辑/.hg/git-map 文件。它应该只包含一个条目,在一侧(应该在右边)有唯一根的散列。将此散列替换为提示之一。不要替换另一边(左),因为它是相应 Git 提交对象的哈希值。
- “ Mercurial pull ”。如果理论成立,这会将新的 Git 节点添加到旧的 Hg 节点上。
可能完全是胡说八道,但至少 hg-git 的旧(“笨”)版本只是通过这个映射文件确定了必要的 git 对象。所以值得一试...
关于git - 从同一个项目但丢失了历史记录的 Git 仓库中 pull Hg 仓库,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17326041/