0

目前这是一个纯理论问题(与相关),但让我先介绍一下背景。每当您运行hg gexport初始哈希值时,都会因调用而异。git init这与运行或时类似hg 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. 最大的区别是,没有这些文件的拉取会成功(但会复制所有内容),而使用它们的拉取将在第一次修订时出错,因为“中止:未知修订版......”(甚至是有道理的)。

问题:hg gexport为了重新开始与 hg-git 同步,我必须保留Git 端数据/元数据的哪些部分和多少(即最低限度!) ?(我无法在文档中找到这一点。)

4

1 回答 1

0

核心元数据存储在 中.hg/git-mapfile,实际的 Git 存储库存储在.hg/git.git依赖于intree. git-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 拉取以填充存储库;否则,转换将失败。

于 2022-01-26T15:30:04.167 回答