Mercurial https 克隆:“中止:错误:(...)错误的版本号”

Posted

技术标签:

【中文标题】Mercurial https 克隆:“中止:错误:(...)错误的版本号”【英文标题】:Mercurial https clone: "abort: error: (...) wrong version number" 【发布时间】:2014-02-24 00:09:51 【问题描述】:

我在 OS X 10.9.1 上遇到了 mercurial 的问题 我在 bitbucket 上有一个包含几个文件的存储库,当我尝试克隆它时出现错误:

mac-mini-jakub:testrepo kubeczek$ hg clone https://kubecz3k@bitbucket.org/kubecz3k/test 
abort: error: _ssl.c:507: error:1408F10B:SSL routines:SSL3_GET_RECORD:wrong version number

我已经从https://www.mercurial-scm.org/downloads/ 安装了适用于 MacOS X 10.9 的 Mercurial 2.8.2

我很确定在 bitbucket 方面一切正常,因为我在 linux 机器上没有问题。

这是完整的回溯:

mac-mini-jakub:testrepo kubeczek$ hg clone https://kubecz3k@bitbucket.org/kubecz3k/test --traceback
Traceback (most recent call last):
  File "/opt/local/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/mercurial/dispatch.py", line 133, in _runcatch
    return _dispatch(req)
  File "/opt/local/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/mercurial/dispatch.py", line 806, in _dispatch
    cmdpats, cmdoptions)
  File "/opt/local/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/mercurial/dispatch.py", line 585, in runcommand
    ret = _runcommand(ui, options, cmd, d)
  File "/opt/local/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/mercurial/dispatch.py", line 897, in _runcommand
    return checkargs()
  File "/opt/local/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/mercurial/dispatch.py", line 868, in checkargs
    return cmdfunc()
  File "/opt/local/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/mercurial/dispatch.py", line 803, in <lambda>
    d = lambda: util.checksignature(func)(ui, *args, **cmdoptions)
  File "/opt/local/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/mercurial/util.py", line 512, in check
    return func(*args, **kwargs)
  File "/opt/local/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/mercurial/commands.py", line 1286, in clone
    branch=opts.get('branch'))
  File "/opt/local/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/mercurial/hg.py", line 268, in clone
    srcpeer = peer(ui, peeropts, source)
  File "/opt/local/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/mercurial/hg.py", line 122, in peer
    return _peerorrepo(rui, path, create).peer()
  File "/opt/local/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/mercurial/hg.py", line 102, in _peerorrepo
    obj = _peerlookup(path).instance(ui, path, create)
  File "/opt/local/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/mercurial/httppeer.py", line 238, in instance
    inst._fetchcaps()
  File "/opt/local/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/mercurial/httppeer.py", line 57, in _fetchcaps
    self.caps = set(self._call('capabilities').split())
  File "/opt/local/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/mercurial/httppeer.py", line 171, in _call
    fp = self._callstream(cmd, **args)
  File "/opt/local/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/mercurial/httppeer.py", line 118, in _callstream
    resp = self.urlopener.open(req)
  File "/opt/local/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/urllib2.py", line 404, in open
    response = self._open(req, data)
  File "/opt/local/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/urllib2.py", line 422, in _open
    '_open', req)
  File "/opt/local/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/urllib2.py", line 382, in _call_chain
    result = func(*args)
  File "/opt/local/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/mercurial/url.py", line 368, in https_open
    return self.do_open(self._makeconnection, req)
  File "/opt/local/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/mercurial/keepalive.py", line 257, in do_open
    raise urllib2.URLError(err)
URLError: <urlopen error [Errno 1] _ssl.c:507: error:1408F10B:SSL routines:SSL3_GET_RECORD:wrong version number>
abort: error: _ssl.c:507: error:1408F10B:SSL routines:SSL3_GET_RECORD:wrong version number

我的 Python 版本是:

mac-mini-jakub:~ kubeczek$ python -V
Python 2.7.6

和 SSL:

>>> print _ssl.OPENSSL_VERSION
OpenSSL 0.9.8y 5 Feb 2013

我会感谢每一个帮助,谢谢!

【问题讨论】:

发布准确的 Python 版本和 SSL 版本(导入 _ssl 并打印 _ssl.OPENSSL_VERSION) @vzamanillo 感谢回复,SSL 版本为:“OpenSSL 0.9.8y 5 Feb 2013”​​,python 版本为:Python 2.7.6 从 Mercurial 2.7 sslutils 在 Python 2.6 及更高版本上强制 SSLv3,bitbucket 使用 V3,所以问题可能与 OpenSSL 有关,请尝试更新 OpenSSL (***.com/questions/18752409/…) 或禁用 Mercurial 证书检查 (@987654323 @) 感谢@vzamanillo 的建议,不幸的是它们不适用于我的情况。禁用证书检查不会改变任何东西,并且由于某种原因我无法完全更新 ssl:在终端中,我现在有版本“OpenSSL 1.0.1f 6 Jan 2014”,但在 python 中仍然有版本“OpenSSL 0.9.8y”。 那是另一种解决方案。很高兴能帮上忙。要升级 python ssl 库,您可以尝试“pip install ssl”,或者您可以下载 python 并编译它,指示 SSL 开发库的位置。无论如何,你已经有了解决方案,不要复杂:) 【参考方案1】:

您必须从系统范围的 mercurial 配置文件或自己的​​配置文件中禁用 clonebundle。

要做,将以下行添加到 /etc/mercurial/hgrc 或 ~/.hgrc

# system-wide mercurial configuration file
# See hgrc(5) for more information
[ui]
clonebundles = False

【讨论】:

【参考方案2】:

正如问题的 cmets 建议的那样,从 https 切换到 ssh 为我修复了它

【讨论】:

【参考方案3】:

对于一些 bitbucket 存储库(但不是全部),我遇到了这个问题。我发现,根据回溯,设置 --config ui.clonebundles=false 有效。

hg clone --config ui.clonebundles=false  https://bitbucket.org/me/myrepo

让你的克隆慢得多。

[编辑] -- 虽然,请参阅我上面对@UniversE 回答的评论,但实际问题是与我的 squid 代理白名单中没有的 atlassian 子域有关。呼,这很难调试。

【讨论】:

【参考方案4】:

您可能必须禁用 TLS,阅读this

为此,请将其添加到 ~/.hgrc

[ui]
tls = False

更多关于 SSL 和 TLS 的信息here

【讨论】:

这是正确的解决方案。 (在某些时候,Mercurial 已经放弃了对 SSLv2 的支持;后来他们添加了这个配置选项,默认为 true) 不适合我,仍然尝试使用 TLS 1.0 进行连接 今天突然发现bitbucket出错了。这个答案解决了这个问题。 修复了它“中止:错误:[SSL: WRONG_VERSION_NUMBER] 错误版本号 (_ssl.c:590)” 我也遇到了 bitbucket 的问题。此解决方案解决了问题!谢谢【参考方案5】:

还有另一个原因。这可能不是您的问题,但也应该在此处列出,以防其他人遇到此问题:

如果您使用代理并且您的代理设置不正确,也会显示此错误消息。天知道为什么……

示例:您有以下配置

[http_proxy]
no = localhost,127.0.0.1
host = 1.2.3.4:8080
user = myusername
passwd = oldpassword

旧密码可能已过时(您忘记更改它)。然后出现同样的 SSL 错误版本错误。它确实毫无意义(至少对我而言),但我用 mercurial 3.6.2 重现了这个问题。更正代理设置可以解决所有问题。

【讨论】:

是的!这个,谢谢。最终发现这是因为 bitbucket 将我指向托管在 media-api.atlassian.io 的捆绑包,而最后一个不在 squid 代理白名单上。唷。谢谢!【参考方案6】:

不完全是直接的解决方案,而是很好的解决方法: 强烈建议问题出在 ssl 我已经切换到 ssh(https://confluence.atlassian.com/pages/viewpage.action?pageId=270827678) 现在一切正常。所以从我的实际角度来看,这个问题已经解决了。

【讨论】:

以上是关于Mercurial https 克隆:“中止:错误:(...)错误的版本号”的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Mercurial 中更新现有克隆存储库的 URL

windows上安装Mercurial4.4.1 克隆OPENJDK版本库

如何从 Mercurial 克隆中删除工作副本?

来自分支的 Mercurial 克隆

从 C# 克隆 Mercurial 存储库?

mercurial 的最佳实践:分支与克隆,以及部分合并?