我是git的新手,我想在gitlab上创建一个仓库。我创建了一个新项目并添加了ssh密钥。在我的桌面上创建了一个新目录。但是当我使用此命令时:
git clone https://gitlab.com ...
它显示:
克隆到...
接下来什么也没有发生。它卡住了。但我可以将其复制到其他存储库(由互联网上的其他人制作)。为什么我无法克隆到我的仓库中?
答案 0 :(得分:0)
由于GitHub or GitLab支持v2 protocol,因此您可以通过所说的v2陷入这种僵局。
在Git 2.28(2020年第三季度)之前,当服务器端过早引发错误并断开连接时,在线协议v2容易陷入remote-curl
帮助程序和fetch-pack
进程之间的僵局。
通信已进行更新,使其更加可靠。
请参见commit b0df0c1,commit 0181b60,commit 74b082a,commit 101736a,commit dde72f9(2020年5月19日)和commit 04cc91a,{{3} }(2020年5月18日)通过commit 51ca7f8。
(由Denton Liu (Denton-L
)在Junio C Hamano -- gitster
--中合并,2020年6月9日)
commit b37fd14:发送响应结束数据包
报告人:查理力
帮助人:杰夫·金
签名人:刘登顿当前,
remote-curl
充当代理,并在HTTP服务器和fetch-pack
之间盲目转发数据包。
在无状态RPC连接的情况下,该连接在事务完成之前被终止,remote-curl
将盲目转发数据包,然后再等待来自fetch-pack的更多输入。
同时,fetch-pack
将读取事务并继续读取,并期望有更多输入来继续事务。这将导致两个进程之间陷入僵局。
(从此开始您的问题)
这可以在以下不终止的命令中看到:
$ git -c protocol.version=2 clone https://github.com/git/git.git --shallow-since=20151012 Cloning into 'git'...
v1版本确实按预期终止:
$ git -c protocol.version=1 clone https://github.com/git/git.git --shallow-since=20151012 Cloning into 'git'... fatal: the remote end hung up unexpectedly
使用
remote-curl
代理远程服务器的响应后,让stateless_connect()
而不是盲目转发数据包,而是插入响应结束数据包。
在RPC客户端,请确保每个响应均按所述结束。选择一个单独的控制包是因为我们需要能够区分远程服务器发送的内容和
remote-curl
的控制包。
通过在remote-curl
代码中确保服务器无法发送响应结束数据包,我们可以防止恶意服务器执行拒绝服务攻击,在这种攻击中,它们欺骗了响应结束数据包并导致描述的死锁发生。
因此,在Git 2.28中,您的情况不再发生:如果克隆必须失败,它将明确地这样做,而不是永远保持“冻结”状态。