gpt4 book ai didi

mercurial - hg clone 在命令之间发送时挂起

转载 作者:行者123 更新时间:2023-12-03 21:38:46 25 4
gpt4 key购买 nike

我正在尝试 克隆 Mercurial 存储库 从 Windows 命令行通过 SSH 托管在 BitBucket 上。

当我添加 --debug 标志时,我可以看到 它永远不会超过“命令之间的发送”

当我ctrl+c时,它只是显示中断!没有任何其他错误消息。

我也在查看资源监视器,它在第一分钟左右后没有显示任何相关的网络流量。

我尝试添加具有相同结果的 --noupdate 选项和 --uncompressed 选项。

Windows Server 2012 只有 Mercurial - 没有 TortoiseHg

有任何想法吗?

“在命令之间发送”需要一段时间是否有原因?存储库大约 150MB

最佳答案

我知道我迟到了,因为 Bitbucket 早就放弃了 Mercurial 支持,但这可能与那些在 Windows 上设置它以与任何其他服务或自托管环境一起使用的人有关。
我假设你设置了 plink作为您的 SSH 客户端。如果没有,这可以通过添加 ssh 轻松完成。 Mercurial 配置中的参数。这是我的mercurial.ini文件内容如下:

>hg config --edit
[ui]
ssh="C:\programs\putty\plink.exe" -ssh -2
在获得 Aha 之前,我花了大约两个小时来修改我的设置!时刻并尝试使用 plink 连接到服务器看看问题是否存在:
>plink.exe hg-ssh@hg.example.com -noagent id
The server's host key is not cached in the registry. You
have no guarantee that the server is the computer you
think it is.
The server's ssh-ed25519 key fingerprint is:
ssh-ed25519 255 90:8d:b0:26:c5:6e:74:2a:6c:3d:80:42:54:9e:15:47
If you trust this host, enter "y" to add the key to
PuTTY's cache and carry on connecting.
If you want to carry on connecting just once, without
adding the key to the cache, enter "n".
If you do not trust this host, press Return to abandon the
connection.
Store key in cache? (y/n)
答对了!
正如你在这里看到的, plink提示输入,我们必须先提供它才能继续进行。这就是 hg 的原因如果我们不这样做,就会无限期地挂起。
您也可以下载 Process Explorer,打开它并从 View 菜单中选择 Show Process Tree (Ctrl+T),然后搜索进程 plink .你可以看到这个进程正在运行并且是 hg 的子进程。 .
我回答“y”, key 被缓存在注册表项下
Computer\HKEY_CURRENT_USER\SOFTWARE\SimonTatham\PuTTY\SshHostKeys
新条目包含远程服务器名称和 key 本身。
一旦解决了问题,我就可以使用 clone 来开展我的业务。 , push , pull ,以及其他命令,如 inout :
>hg clone ssh://hg-ssh@hg.example.com/review
destination directory: review
requesting all changes
adding changesets
adding manifests
adding file changes
added 2 changesets with 4 changes to 4 files
new changesets f82779871203:e9b1a2b79f98 (1 drafts)
updating to branch default
4 files updated, 0 files merged, 0 files removed, 0 files unresolved
看起来像 hg与 SSH 客户端的输入和输出混淆,您永远无法看到那里发生了什么,也无法与之交互。并指定 --debug选项没有区别。
您也可以提供 -sshlog plink 的选项将 session 的日志协议(protocol)详细信息保存到文件中:
[ui]
ssh="C:\programs\putty\plink.exe" -ssh -2 -sshlog plink.log
这是日志的一部分,其中表示客户端不知道主机 key :
Incoming packet #0x2, type 21 / 0x15 (SSH2_MSG_NEWKEYS)
Event Log: Server also has ecdsa-sha2-nistp256/ssh-rsa host keys,
but we don't know any of them
Event Log: Host key fingerprint is:
Event Log: ssh-ed25519 255 90:8d:b0:26:c5:6e:74:2a:6c:3d:80:42:54:9e:15:47
它卡在那个地方等待用户输入。
出于好奇,我下载了 Mercurial 源代码并将调试消息跟踪到方法 _performhandshake。在 hg/mercurial/sshpeer.py :
$ hg clone https://www.mercurial-scm.org/repo/hg

$ grep -R 'sending between command' hg

$ less hg/mercurial/sshpeer.py
ui.debug(b'sending hello command\n')
ui.debug(b'sending between command\n')
Full sshpeer.py source code .
您可以查看调用堆栈,在 instance 内有一个调用。到 _makeconnection , 进而调用 procutil.popen4 ,然后使用 subprocess.Popen生成一个新进程的类构造函数,以及 subprocess.PIPE用作 stdin 的值, stdout , 和 stderr论据。
来自 subprocess manual ,你可以看到:

PIPE indicates that a new pipe to the child should be created.


所以这几乎解释了为什么你不能与 SSH 客户端交互,因为它的所有标准输入、标准输出和标准错误都被 Mercurial 吃掉了。
任何阅读此答案的人,请尝试此解决方案,并让我们知道它是否有帮助!

关于mercurial - hg clone 在命令之间发送时挂起,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30517209/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com