Mercurial空白分支致Redmine同步失败,求移除/重命名方案
解决Mercurial空白名称分支引发的Redmine同步问题
我来帮你搞定这个棘手的空白分支问题——这类命名异常的分支确实会让依赖分支名称的工具(比如Redmine)出故障,而且直接关闭推送还报错,下面是几个可行的解决方案,按推荐优先级排序:
方法一:服务器端重命名空白分支(最安全)
如果你能直接访问Mercurial服务器的仓库目录,这是最稳妥的办法:
- 登录服务器,进入目标仓库的根目录
- 先定位空白分支的所有变更集,确认目标:
你会看到所有属于空白分支的提交,重点确认你提到的变更集2004hg log -r "branch('')" - 用
hg rebranch给空白分支改个明确的名字(需要Mercurial 4.3及以上版本支持):
这里把空白分支重命名成hg rebranch -r 2004 "empty-branch-to-close"empty-branch-to-close,方便后续操作 - 切换到这个重命名后的分支,执行关闭操作:
hg update empty-branch-to-close hg commit --close-branch -m "Close invalid empty-named branch" - 最后正常推送到服务器:
hg push
方法二:用hg strip彻底移除空白分支(谨慎操作)
如果这个空白分支的历史完全没用,也可以直接剥离相关变更集,但务必先备份仓库,因为strip会永久删除提交:
- 先列出空白分支的所有变更集编号:
hg log -r "branch('')" --template "{rev}\n" - 剥离目标变更集(比如你说的2004):
如果空白分支有多个连续提交,可以用范围,比如hg strip -r 2004hg strip -r 2004::tip(前提是2004是空白分支的起始提交) - 推送剥离后的变更到服务器,需要加
--force强制覆盖:hg push --force
方法三:临时修改Redmine代码应急(不推荐长期用)
如果暂时碰不到Mercurial服务器,也可以临时修改Redmine的适配代码,让它能处理空分支名称:
- 找到Redmine安装目录下的
lib/redmine/scm/adapters/mercurial_adapter.rb,定位到报错的第123行 - 原代码应该是直接访问了一个可能为nil的哈希值,我们加个空值判断:
# 原代码大概是这样: branch = branches[changeset.branch] # 修改成: branch = branches[changeset.branch] || {} - 重启Redmine服务,这样同步时就不会因为空分支报错了,之后还是要尽快处理Mercurial仓库里的空白分支
验证解决效果
操作完成后,先在本地或服务器执行hg branches,确认空白分支已经消失或者被重命名;然后去Redmine手动触发仓库同步,检查是否还有之前的NoMethodError报错。
内容的提问来源于stack exchange,提问作者Charles Chen
相关产品推荐
相关产品推荐

