我需要备份 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 init
或 hg init
。但是,由于 Mercurial 和 Git 提交相互对应并建立在以前的哈希值之上,因此应该有某种方法可以从最小公共初始状态(或 Git 端的最小状态,因为例如)。
假设我过去使用过 hg-git,现在我试图在我的 Mercurial 和我的 Git 状态之间再次同步,但没有(或很少)原始 .git
目录来自 hg gexport
。不过,我做的是两个元数据文件:git-mapfile
和git-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-mapfile
和 git-tags
)放入 .hg
显然没有太大区别。最大的区别是,没有这些文件的拉取会成功(但会复制所有内容),而带有它们的拉取将在第一次修订时出错,因为“中止:未知修订...”(甚至有道理)。
问题: Git 侧 data/metadata 的哪一部分和多少(即最小值是多少!) 12=] 我是否必须留在身边才能重新开始与 hg-git 同步? (我无法在文档中找到它。)
核心元数据存储在 .hg/git-mapfile
中,实际 Git 存储库存储在 .hg/git
或 .git
中,具体取决于 intree
。 git-mapfile
是重现完整状态所需的 唯一 文件;其他任何东西都只是缓存。要从头开始重新创建存储库,请执行以下操作:
- 以某种方式克隆或初始化 Mercurial 存储库。
- 克隆或初始化嵌入式 Git 存储库,例如使用
git clone --bare git+ssh://username@server.tld/project/repo.git .hg/git
.
- 从原始存储库复制元数据,并将其放入
.hg/git-mapfile
。
- 运行
hg git-cleanup
从映射中删除 Mercurial 不再知道的任何提交。
- 从 Git 拉取。
- 推送到 Git。
这些是我想使用的步骤。最后三个步骤是最重要的。特别是,您 必须 从 Git 拉取以在推送之前填充存储库;否则,转换将失败。
目前这是一个纯理论问题(与this one相关),但让我先介绍一下背景。每当您 运行 hg gexport
时,初始哈希都会因调用而异。这类似于 运行 git init
或 hg init
。但是,由于 Mercurial 和 Git 提交相互对应并建立在以前的哈希值之上,因此应该有某种方法可以从最小公共初始状态(或 Git 端的最小状态,因为例如)。
假设我过去使用过 hg-git,现在我试图在我的 Mercurial 和我的 Git 状态之间再次同步,但没有(或很少)原始 .git
目录来自 hg gexport
。不过,我做的是两个元数据文件:git-mapfile
和git-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-mapfile
和 git-tags
)放入 .hg
显然没有太大区别。最大的区别是,没有这些文件的拉取会成功(但会复制所有内容),而带有它们的拉取将在第一次修订时出错,因为“中止:未知修订...”(甚至有道理)。
问题: Git 侧 data/metadata 的哪一部分和多少(即最小值是多少!) 12=] 我是否必须留在身边才能重新开始与 hg-git 同步? (我无法在文档中找到它。)
核心元数据存储在 .hg/git-mapfile
中,实际 Git 存储库存储在 .hg/git
或 .git
中,具体取决于 intree
。 git-mapfile
是重现完整状态所需的 唯一 文件;其他任何东西都只是缓存。要从头开始重新创建存储库,请执行以下操作:
- 以某种方式克隆或初始化 Mercurial 存储库。
- 克隆或初始化嵌入式 Git 存储库,例如使用
git clone --bare git+ssh://username@server.tld/project/repo.git .hg/git
. - 从原始存储库复制元数据,并将其放入
.hg/git-mapfile
。 - 运行
hg git-cleanup
从映射中删除 Mercurial 不再知道的任何提交。 - 从 Git 拉取。
- 推送到 Git。
这些是我想使用的步骤。最后三个步骤是最重要的。特别是,您 必须 从 Git 拉取以在推送之前填充存储库;否则,转换将失败。