使用TortoiseHG向本地Phabricator推送Mercurial代码报错求助
Mercurial仓库推送/拉取Phabricator失败的排查与解决
问题概述
- 使用Workbench或TortoiseHG操作Mercurial仓库时,向Phabricator生产环境推送(push)或拉取(pull)均失败
- 报错:
HTTP Error: 500 (Error 255: abort: potentially unsafe serve --stdio invocation: ['serve', '--stdio']) - Git仓库无异常,仅Mercurial仓库出现该问题,已开启Diffusion的HTTP推送权限但未解决
- 后台报错日志:
EXCEPTION: (Exception) Expected nonempty 'cmds' specification! at [<phabricator>/src/applications/diffusion/protocol/DiffusionMercurialWireProtocol.php:68]... phabricator c9cc3832912f9c52ec1ea1397c062cc3f8ffc659 (Oct 9 2016) arcanist 71132dbee0e2b585bdacd1481ef76eb210814139 (Oct 9 2016) phutil dd02a0817366bf78d7e468143fbac0e42db7d7c7 (Oct 9 2016)
问题原因
该问题是旧版本Phabricator(2016年版本)与新版本Mercurial的兼容性冲突:Mercurial后续版本新增了对serve --stdio调用的安全校验机制,而旧版Phabricator的Diffusion模块未正确传递必要参数,触发了Mercurial的安全拦截,同时服务端代码因cmds参数为空抛出500错误。
解决方法
方法一:客户端临时绕过(快速生效)
在本地Mercurial配置中添加参数,跳过安全检查:
- 打开本地全局配置文件
~/.hgrc(Windows用户为C:\Users\<用户名>\Mercurial.ini),或仓库内的.hg/hgrc文件 - 添加以下配置:
[phabricator] skip-security-check = True
- 保存配置后,重新尝试推送/拉取操作
方法二:服务端永久修复(推荐)
- 升级Phabricator:将Phabricator、Arcanist、Phutil升级到2016年10月之后的版本,官方已在后续版本中修复了该兼容性问题,适配了Mercurial的安全校验逻辑。
- 临时代码修改(无法升级时):
编辑服务端的<phabricator>/src/applications/diffusion/protocol/DiffusionMercurialWireProtocol.php文件,找到第68行附近的代码,确保cmds数组被正确初始化。例如,在构建Mercurial命令时,添加--config extensions.serve=参数,强制禁用Mercurial的安全检查扩展,避免触发拦截。
内容的提问来源于stack exchange,提问作者bill saplam
相关产品推荐
相关产品推荐

