Mercurial克隆仓库合并报错:无变更却提示未提交本地修改
Mercurial合并异常:未提交修改提示与缺失文件问题
问题描述
仓库存在两个分支头(变更集13和12),刚克隆仓库并切换到变更集13后,执行hg merge 12提示abort: uncommitted changes,但hg status无任何输出;强制合并后提交时,系统提示有21个缺失文件但未列出,hg status仍显示干净。环境为Mercurial 6.6.3(TortoiseHg)、仅启用标准扩展,操作系统Win10/Win11。
附操作记录:
C:\Users\ar\judo> hg clone -U docs docsclone C:\Users\ar\judo> cd docsclone C:\Users\ar\judo\docsclone>hg log -G o changeset: 13:00e42bc1d80c | tag: tip | parent: 11:2636897b57e0 | user: alre | date: Sat Mar 16 23:40:29 2024 +0100 | summary: fixed DT handling in results export script | | o changeset: 12:258250141287 |/ user: indo | date: Sat Mar 16 23:36:59 2024 +0100 | summary: JMP 2024 done + results exported | o changeset: 11:2636897b57e0 | user: alre | date: Fri Mar 15 23:03:43 2024 +0100 | summary: prepared tournament files JMP 2024 | ... (clipped) C:\Users\ar\judo\docsclone>hg update 13 4404 files updated, 0 files merged, 0 files removed, 0 files unresolved C:\Users\ar\judo\docsclone>hg merge 12 abort: uncommitted changes (use 'hg status' to list changes) C:\Users\ar\judo\docsclone>hg status C:\Users\ar\judo\docsclone>hg status --all C .hgignore ... (clipped; shows all Clean) C:\Users\ar\judo\docsclone>hg commit nothing changed (21 missing files, see 'hg status') C:\Users\ar\judo\docsclone>hg purge --all c:\Users\ar\judo\docsclone>hg update null 0 files updated, 0 files merged, 4383 files removed, 0 files unresolved c:\Users\ar\judo\docsclone>hg update 13 4404 files updated, 0 files merged, 0 files removed, 0 files unresolved
解决方案
1. 重置工作区至干净状态
执行以下命令强制将工作区恢复到变更集13的纯净状态,消除潜在的状态缓存异常:
hg update --clean 13
完成后再次尝试合并:
hg merge 12
2. 检查仓库完整性与元数据
运行仓库验证命令,排查是否存在变更集或文件损坏:
hg verify
如果验证发现错误,尝试恢复仓库(需确保有备份):
hg recover
若恢复无效,重新克隆完整仓库(避免使用-U参数,直接克隆并自动更新到tip):
hg clone docs docsclone_new cd docsclone_new hg update 13 hg merge 12
3. 排查Windows文件系统大小写冲突
Windows默认大小写不敏感,若两个分支存在文件名大小写不同的文件,会导致Mercurial状态判断异常。
- 启用大小写冲突警告后重新克隆:
hg clone --config ui.casecollision=warn docs docsclone_casefix
- 检查仓库中是否存在大小写差异的文件(PowerShell命令):
hg log -T "{files}\n" | Select-String -Pattern "(^|[^a-zA-Z0-9])([a-z][A-Z]|[A-Z][a-z])" | Sort-Object | Get-Unique
找到冲突文件后,统一文件名大小写再进行合并。
4. 调试并重置Mercurial状态缓存
使用调试命令重置Mercurial内部状态缓存,解决状态显示不一致问题:
hg debugstate --reset
执行后再次查看状态并尝试合并:
hg status hg merge 12
5. 查看缺失文件具体信息
执行以下命令强制显示缺失文件列表:
hg status --missing
根据输出找到缺失文件,检查是否被.hgignore规则排除,或手动恢复这些文件后再提交。
内容的提问来源于stack exchange,提问作者Pastagod
相关产品推荐
相关产品推荐

