执行hg convert命令报WdirUnsupported错误的原因及解决方法
错误产生原因
这个WdirUnsupported异常是Mercurial 4.6.1版本的已知逻辑缺陷导致的,结合你用hg convert裁剪仓库、删除指定文件生成新仓的场景,具体触发逻辑如下:
- 从报错调用栈可以看到,崩溃发生在TortoiseHg加载指定修订的文件列表、解析子仓库状态的环节:代码读取
.hgsubstate子仓库状态文件时,拿到了指向工作目录伪修订(wdir,是Mercurial用来标识未提交工作区状态的特殊标记,不是真实存在的提交版本)的引用,尝试去版本日志里查这个伪修订对应的真实节点时,直接触发了不支持访问工作目录修订的报错。 - 常见触发前提分两种:一是原仓库对应出错的修订里,
.hgsubstate本身就记录了子仓库未提交的工作区状态,属于不规范的提交内容;二是你配置的convert文件过滤规则误删/改坏了.hgsub、.hgsubstate的内容,导致解析子仓库元数据时拿到了无效的引用值。 - 你贴的报错不是convert命令运行时直接抛出的,是convert生成的目标仓库已经存在元数据损坏,你在TortoiseHg GUI里点选出错修订时,界面加载文件清单触发的崩溃。
对应修复方案
- 优先升级Mercurial和TortoiseHg版本:4.6.1是2018年发布的老旧版本,5.0及之后的正式版本已经修复了子仓库wdir引用解析崩溃的问题,升级后清空之前生成的损坏目标仓库,从头执行convert流程即可自动跳过无效的wdir引用,不会触发报错。
- 若暂时无法升级版本,修改convert的文件映射规则,直接排除子仓库元数据文件,在映射配置中加入以下规则:
exclude .hgsub exclude .hgsubstate
转换后的新仓库会直接丢弃所有子仓库配置,完全跳过子仓库状态解析逻辑,从根源避开这个报错。如果新仓库需要保留子仓库配置,等convert完成后,手动在新仓库对应提交中补充指向真实提交哈希的子仓库配置文件即可。
- 提前修复原仓库的问题提交:在原仓库中切到报错对应的修订版本,检查
.hgsubstate文件内容,删除/修正其中指向工作目录、不存在的提交哈希的无效条目,提交修复补丁后,再基于修复后的原仓库执行convert操作。 - 不要复用之前转换生成的损坏目标仓库:每次重试convert前,先彻底删除之前生成的目标仓库目录,避免残留的损坏元数据导致重复报错。
内容的提问来源于stack exchange,提问作者frank_crane
相关产品推荐
相关产品推荐

