Git通过SSH推送时无限挂起,寻求长期解决方案
Git SSH推送无限挂起的长期解决方案
我在向Git仓库推送代码时遇到无限挂起的问题,确认是SSH层面的问题——切换为HTTPS远程地址后推送正常,但我更习惯用SSH访问。目前重启SSH代理能临时解决单次推送:
launchctl stop /System/Library/LaunchAgents/org.openbsd.ssh-agent launchctl start /System/Library/LaunchAgents/org.openbsd.ssh-agent
但需要更稳定的长期解决办法,以下是可行方案:
1. 配置SSH连接复用
在~/.ssh/config文件中添加连接复用配置,让SSH复用已建立的连接,避免每次推送重新握手时出现异常:
Host * ControlMaster auto ControlPath ~/.ssh/sockets/%r@%h-%p ControlPersist 600s
创建对应的sockets目录并设置权限:
mkdir -p ~/.ssh/sockets chmod 700 ~/.ssh/sockets
2. 调整SSH超时参数
在~/.ssh/config中添加存活检测配置,防止连接因长时间无响应挂起:
Host * ServerAliveInterval 30 ServerAliveCountMax 3
ServerAliveInterval:每30秒向Git服务器发送一次存活信号ServerAliveCountMax:连续3次未收到响应则主动断开连接,避免无限挂起
3. 修复SSH密钥及配置文件权限
权限过宽会导致SSH拒绝使用密钥,执行以下命令修正:
chmod 700 ~/.ssh chmod 600 ~/.ssh/id_rsa # 若使用ed25519密钥则替换为id_ed25519 chmod 644 ~/.ssh/authorized_keys ~/.ssh/config
4. 替换系统SSH代理为自定义代理
系统自带的ssh-agent可能存在稳定性问题,可禁用它并在shell启动时手动加载:
首先禁用系统代理:
launchctl unload -w /System/Library/LaunchAgents/org.openbsd.ssh-agent.plist
然后在~/.zshrc(或~/.bash_profile,取决于你用的shell)中添加:
if [ -z "$SSH_AUTH_SOCK" ]; then eval "$(ssh-agent -s)" ssh-add ~/.ssh/id_rsa # 替换为你的密钥路径 fi
每次打开终端会自动启动代理并加载密钥,避免系统代理的异常。
5. 指定Git使用系统SSH程序
部分Git版本会使用内置SSH而非系统SSH,导致兼容性问题,可强制指定系统SSH路径:
git config --global core.sshCommand "/usr/bin/ssh"
内容的提问来源于stack exchange,提问作者Tydal
相关产品推荐
相关产品推荐

