Hg仓库转Git执行hg gexport报no match found错误如何解决
Mercurial仓库迁移Git时hg gexport报错修复
问题场景
参考多份.hg格式Mercurial仓库转.git格式Git仓库的操作方案执行迁移,运行导出命令:
hg gexport --debug
执行到某一历史版本时触发中断,报错信息如下:
abort: data/web/Server/Properties/PublishProfiles/Web Deploy.pubxml@842a35fd10b511e515bfdf83c67300102000a187: no match found
对应提交曾出现操作异常:当时误删除了.xml文件,最终通过先添加该文件提交、再删除文件重新提交的方式才完成推送,该操作和本次报错直接相关。
报错含义
该报错是hg-git导出插件遍历Mercurial全量提交历史时,无法找到指定哈希节点对应的Web Deploy.pubxml文件的实际存储数据块,属于Mercurial仓库revlog文件元数据链断裂问题。
误删文件后先加回提交、再删除重提的异常操作序列是直接诱因:这类非常规文件操作如果当时推送时存在本地与远端元数据不同步、或操作中途触发revlog索引写入异常,就会出现提交记录里登记了文件节点、但对应实际数据块缺失的问题。这类问题在日常Mercurial提交、拉取操作中不会触发,只有全量遍历历史的导出操作会触发报错中断。
修复方案
- 方案1:修复原仓库损坏的历史
先在原Mercurial仓库根目录执行hg verify做仓库完整性校验,确认损坏的日志块位置。校验完成后如果确认是那两次异常提交导致的损坏,先全量备份本地仓库文件夹,再执行hg strip移除报错对应的连续两个异常提交,重新做一次正确的文件删除操作并提交,之后重新执行hg gexport --debug即可正常导出。 - 方案2:配置hg-git跳过缺失节点
如果不想改动原Mercurial仓库的提交历史,可以打开仓库下的.hg/hgrc配置文件,添加如下配置项:
保存配置后重新执行导出命令,插件遇到缺失的文件数据块时会自动跳过,不会中断迁移流程。该方式导出的Git仓库不会包含损坏节点对应的无效文件版本,不影响仓库后续正常使用。[git] export-ignore-missing = True - 方案3:重整仓库后再导出
如果前两种方案无效,可以先使用Mercurial自带的convert扩展对原仓库做一次全量元数据重整,生成一份修复了历史断裂问题的新Mercurial仓库,重整命令为hg convert --source-type hg --dest-type hg 原仓库本地路径 新仓库存储路径,之后在新生成的仓库上重新执行gexport导出即可。
内容的提问来源于stack exchange,提问作者Brad
相关产品推荐
相关产品推荐

