真的是通过SSH测试Git连接的详细方法吗?


109

使用GIT时,我在SSH上使用GIT时遇到问题,由于它在工作时以及在其他调制解调器上都可以正常工作,因此显然是我的家用调制解调器正在工作。通过HTTP连接没有问题。

因此,我假设这是SSH问题,但是我不擅长直接使用它。我是否可以运行任何命令来建立“测试”连接,并让我确切地知道问题何时何地发生?

几乎所有的“大”命令(如fetchclonepush有多少数据)从git(即使与运行-v)只是“挂”在没有说明为什么他们已经停止了远程连接的中间,所以他们是没有用的。

有什么办法可以获取有关SSH连接中发生的情况的更多详细信息?

Answers:


113

环境变量

从Git 2.3.0版开始,您可以使用环境变量GIT_SSH_COMMAND-v像下面这样传递详细参数:

GIT_SSH_COMMAND="ssh -v" git clone example

更加冗长,使其-vvv

GIT_SSH_COMMAND="ssh -vvv" git clone example

Git配置

在Ubuntu 17.04的存储库中的Git版本2.10.0中,您可以全局保存此配置,也可以按以下示例保存每个存储库的配置:

git config core.sshCommand "ssh -vvv"
git pull

至少对我而言,如果执行此操作:GIT_SSH_COMMAND="ssh -v" git clone example我可以调试SSH版本,则在Cloning into消息后将其打印出来,但在失败git clone。我删除后,GIT_SSH_COMMAND它的工作原理。最终,达到了目的。
Paulo Oliveira

5
这将是一次更好的选择:git -c core.sshCommand="ssh -vvv" pull
Joseph K. Strauss

git config --global core.sshCommand "ssh -vvv" git clone example
Azodium

81

我有一个类似的问题。为了调试,我在ssh_config中添加了一行。这是我的操作方法:

git remote -v

在这里,您会发现这样的一行:

origin  git@github.com:me/test.git (fetch)
origin  git@github.com:me/test.git (push)

在这种情况下,主机是github.com。现在,您可以在ssh配置中添加主机条目:

vim ~/.ssh/config

并添加:

Host github.com
    LogLevel DEBUG3

使用git操作时,现在应该会收到大量调试消息。要获得较少的调试消息,请尝试使用DEBUG1

对于> = 2.3.0的GIT版本,请参阅@Flimm答案以获取更智能的解决方案。


14

通读man git,可以设置一些有用的环境变量,GIT_TRACE_PACKET然后GIT_TRACE。例如:

GIT_TRACE_PACKET=true git clone ssh://[...]

游戏有点晚了,但是希望这对某人有帮助!


1
这很有用,但是您不会收到有关SSH连接问题的任何消息。但是,如果SSH连接有效,则这是进一步调试的方法。
Trendfischer 2015年

5

man ssh

 -v      Verbose mode.  Causes ssh to print debugging messages about its progress.  This
         is helpful in debugging connection, authentication, and configuration problems.
         Multiple -v options increase the verbosity.  The maximum is 3.

因此,请尝试ssh -v。如果那还不能告诉您您需要了解什么,则可以添加一到两个v来获取更详细的调试信息。特别是对于Github,请尝试ssh -vvvT git@github.com

通常,根据我的经验,当客户端无法完成所选的身份验证方法时,会在安装过程中挂起SSH会话。检查您的私钥是否在正确的位置并具有正确的权限,并与您给Github的公钥匹配。


感谢您的回答,但我可能应该以不同的方式提出这个问题(因为GitHub不允许这样的直接SSH连接)。我编辑了帖子和标题,但是最好丢掉该帖子并创建一个新问题吗?
IQAndreas

@ IQAndreas,GitHub确实允许这样的SSH连接,因为它将执行身份验证阶段,并且如果问题确实在SSH步骤中发生,您将以这种方式看到它。如果您发现无法做到那么远,则说明正在发生某种事情,甚至无法建立连接。
tgies 2013年

1
我正在通过身份验证,有时候push/ pull在回购中没有问题。但是通常它只是在命令中间“挂起”而不会继续(尤其是当我传输大量数据(例如big clonepush)时)。没有错误消息,它只是坐在那里并且不会继续。
IQAndreas

3

我没有办法告诉git(1)用于ssh(1)的外部命令,但是作为一种解决方法,只需将/ path / to / ssh重命名为/path/to/ssh.orig,创建一个shell脚本包装程序/ path / to / ssh,并添加-v标志:

$ sudo mv /usr/bin/ssh /usr/bin/ssh.orig
$ sudo vim /usr/bin/ssh
$ cat /usr/bin/ssh
#!/bin/sh

if [ -x /usr/bin/ssh.orig ]; then
    exec /usr/bin/ssh.orig -v -v -v "${@}"
fi

$ sudo chmod a+x /usr/bin/ssh

当执行通过ssh传输操作的git命令时,我得到详细的输出。完成调试后,删除脚本并将/path/to/ssh.orig恢复到/ path / to / ssh。


4
与其将文件移入/usr/bin,不如考虑将包装器脚本放入/usr/local/bin
muru

2
至少在我奇怪的Windows安装中,GIT_SSH可以将环境变量设置为指向您要Git使用的二进制文件。
编码员

如前所述,您绝对不想修改原始的ssh文件,但是我对/ usr / local /中的解决方法有所保留。它不透明,很容易踩到。更好:将解决方法脚本放入$ HOME / bin中,并在用户的$ PATH变量中的其他PATH段之前添加新的bin目录。在此之前,我将检查是否没有更好的ENV var解决方案(此答案很旧)。
Scott Prive
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.