我需要备份 hg-git 元数据状态的哪些部分才能重新开始?

What parts of the hg-git metadata state do I need to back up in order to start over?

目前这是一个纯理论问题(与this one相关),但让我先介绍一下背景。每当您 运行 hg gexport 时,初始哈希都会因调用而异。这类似于 运行 git inithg init。但是,由于 Mercurial 和 Git 提交相互对应并建立在以前的哈希值之上,因此应该有某种方法可以从最小公共初始状态(或 Git 端的最小状态,因为例如)。

假设我过去使用过 hg-git,现在我试图在我的 Mercurial 和我的 Git 状态之间再次同步,但没有(或很少)原始 .git 目录来自 hg gexport。不过,我的是两个元数据文件:git-mapfilegit-tags

有一个旧的 Git 镜像,有点“落后”,而 Mercurial 存储库是最新的。

然后我像这样为 hg-git 配置 Mercurial 存储库 (.hg/hgrc):

[git]
intree = True

[extensions]
hgext.bookmarks=
topic=
hggit=

[paths]
default = ssh://username@hgserver.tld//project/repo
gitmirror = git+ssh://username@server.tld/project/repo.git

如果我现在做天真 hg pull gitmirror 我将获得的是 每个 不相关分支上的现有提交的重复,具有不相关的提交历史(以及双倍数量头的数量,与拉动之前相比)。

将这两个元数据文件(git-mapfilegit-tags)放入 .hg 显然没有太大区别。最大的区别是,没有这些文件的拉取会成功(但会复制所有内容),而带有它们的拉取将在第一次修订时出错,因为“中止:未知修订...”(甚至有道理)。

问题: Git 侧 data/metadata 的哪一部分和多少(即最小值是多少!) 12=] 我是否必须留在身边才能重新开始与 hg-git 同步? (我无法在文档中找到它。)

核心元数据存储在 .hg/git-mapfile 中,实际 Git 存储库存储在 .hg/git.git 中,具体取决于 intreegit-mapfile 是重现完整状态所需的 唯一 文件;其他任何东西都只是缓存。要从头开始重新创建存储库,请执行以下操作:

  1. 以某种方式克隆或初始化 Mercurial 存储库。
  2. 克隆或初始化嵌入式 Git 存储库,例如使用 git clone --bare git+ssh://username@server.tld/project/repo.git .hg/git.
  3. 从原始存储库复制元数据,并将其放入.hg/git-mapfile
  4. 运行 hg git-cleanup 从映射中删除 Mercurial 不再知道的任何提交。
  5. 从 Git 拉取。
  6. 推送到 Git。

这些是我想使用的步骤。最后三个步骤是最重要的。特别是,您 必须 从 Git 拉取以在推送之前填充存储库;否则,转换将失败。