Mercurial -> Git 保留提交哈希的迁移

Mercurial -> Git migration with preserving commit hashes

是否有任何现有工具能够在保留提交哈希的同时将 mercurial 存储库导出到 git 存储库?

我知道 hg-git 或 fast-export.git,但它们会创建具有新哈希的新提交(而且似乎没有任何选项可以配置它)。 我们在 Bitbucket 上托管了数百个 Mercurial 存储库,其中包含大量依赖于精确哈希的挂钩、下载链接等。能够保留哈希值将为我们节省更新所有外部资源所需的大量工作。

不可能。

Git object 的哈希 ID 是基础 object 数据的加密校验和。在提交 object 的情况下,这是字符串 commit 的加密校验和,space,以十进制表示的其余数据的字节大小,ASCII NUL,然后是 headers、日志消息文本和预告片。

Mercurial 提交的哈希 ID 是该提交的 Mercurial 数据的适当部分的加密校验和(Mercurial 的数据结构不同,因此某些提交数据不参与校验和)。

今天唯一已知的从一些已知数据构造特定哈希 ID 的方法——就像你在 Git 提交中所做的那样——是添加一个 "junk" 数据区域,然后花费许多 CPU-years计算junk-data中不同内容的哈希值。创建 shattered 的团队使用 compute-time 中的 110 GPU-years 找到 1 个重复的哈希 ID。