Mercurial执行hg status报错ValueError: overflow in dirstate求修复
ValueError: overflow in dirstate错误 你碰到的这个错误是Mercurial的dirstate文件损坏导致的,具体报错内容如下:
12:12 user@host ~/projects/nsr% hg st
** unknown exception encountered, please report by visiting **
https://mercurial-scm.org/wiki/BugTracker
** Python 2.7.9 (default, Jun 29 2016, 13:08:31) [GCC 4.9.2] **
** Mercurial Distributed SCM (version 3.9.1) **
** Extensions loaded: extdiff, color, graphlog, rebase, strip, mq, shelve, churn, purge, record **
Traceback (most recent call last):
File "/usr/bin/hg", line 45, in
mercurial.dispatch.run()
.....
File "/usr/lib/python2.7/dist-packages/mercurial/util.py", line 888, in wrapper
return func(*args, **kwargs)
ValueError: overflow in dirstate
zsh: exit 1
简单说,.hg/dirstate是Mercurial用来记录本地文件状态的核心文件,一旦它损坏,hg status这种需要读取状态的命令就会崩溃,但hg log和hg diff因为不依赖完整的dirstate所以能正常运行。下面是几个靠谱的修复方案,按推荐程度排序:
方案1:用内置命令重建dirstate(最安全)
Mercurial自带了重建dirstate的调试命令,这是最稳妥的方式,不会触碰你的提交历史:
- 先备份损坏的dirstate文件,以防万一:
cp .hg/dirstate .hg/dirstate.bak - 执行重建命令:
hg debugrebuilddirstate
这个命令会根据仓库的最新提交和本地文件系统的实际情况,重新生成一个干净的dirstate文件。执行完成后再运行hg status,应该就能正常显示文件状态了。
方案2:手动删除dirstate后重新同步
如果方案1没有生效,可以尝试手动删除损坏的文件,让Mercurial自动重新生成:
- 同样先备份原文件:
cp .hg/dirstate .hg/dirstate.bak - 删除损坏的dirstate文件:
rm .hg/dirstate - 执行
hg update命令,Mercurial会自动重新生成dirstate:hg update
这个操作会让Mercurial重新对比本地文件和仓库提交的差异,所以hg status会重新计算所有文件的状态,耗时可能比方案1久一点,但修复效果是一致的。
方案3:排查文件系统问题(前两个方案失效时用)
如果上面的方法都无法解决问题,可能是文件系统本身的问题导致dirstate文件损坏:
- 检查磁盘是否存在坏道或文件系统错误,比如Linux下可以使用
fsck命令(记得先卸载对应的分区) - 确认磁盘有足够的剩余空间,磁盘满也会导致文件写入不完整
- 排查是否有其他进程在干扰
.hg目录,比如杀毒软件、同步工具这类,它们可能会打断Mercurial的文件操作
内容的提问来源于stack exchange,提问作者Samuel Dauzon

