在使用 GIT 时,我有通过 SSH 使用 GIT 的问题,而且由于它在工作时和在家使用不同的调制解调器时都运行良好,所以显然是我的家用调制解调器出了问题。我通过 HTTP 连接时没有遇到任何问题。
因此,我假设这是 SSH 问题,但我并不擅长直接使用它。是否有任何命令可以运行以建立“测试”连接,并让我确切知道问题发生的时间和地点?
几乎所有“较大”的命令(例如fetch
,clone
或push
包含大量数据的命令)git
(即使使用运行-v
)都只是在远程连接中间“挂起”,而没有任何迹象表明它们为何停止,因此它们毫无用处。
有什么方法可以获得有关 SSH 连接中发生的情况的更多详细信息?
答案1
环境变量
从 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 配置
从 Git 版本 2.10.0(位于 Ubuntu 17.04 的存储库中)开始,您可以全局保存此配置,或者按存储库保存,如下例所示:
git config core.sshCommand "ssh -vvv"
git pull
答案2
我遇到了类似的问题。为了进行调试,我在 ssh_config 中添加了一行。以下是我所做的:
git remote -v
在那里你会发现这样的一行:
origin [email protected]:me/test.git (fetch)
origin [email protected]:me/test.git (push)
在这种情况下,主机是github.com
。现在您可以在 ssh 配置中添加 Host-Entry:
vim ~/.ssh/config
并添加:
Host github.com
LogLevel DEBUG3
使用 git 操作时,您现在应该会收到大量调试消息。要获得较少的调试消息,请尝试使用DEBUG1
为了GIT 版本 >= 2.3.0查看来自@Flimm 的回答寻找更智能的解决方案。
答案3
通读后man git
,你会发现你可以设置一些有用的环境变量,GIT_TRACE_PACKET
例如GIT_TRACE
:
GIT_TRACE_PACKET=true git clone ssh://[...]
游戏有点晚了,但希望这对某些人有帮助!
答案4
我没有看到告诉 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。