是否存在pre-pre-push Git钩子?用于push前切换远程服务器
解决方案:替代pre-pre-push的Git连接自动切换方案
Git官方并没有提供pre-pre-push这类钩子——pre-push已经是Git push流程中最早的可自定义钩子环节,但你遇到的问题是Git在执行pre-push脚本前就尝试与远程建立SSH连接,这是因为Git解析SSH类型的远程URL时,会提前触发SSH握手操作,导致pre-push无法在连接前介入。
针对你的需求,推荐通过自定义Git命令替代原生git push,在命令内部先完成连通性检查、端口转发和远程URL切换,再执行推送操作,具体实现如下:
步骤1:创建自定义Git推送命令
在你的系统PATH目录下(比如~/.local/bin/)创建名为git-mypush的脚本,赋予可执行权限:
#!/bin/bash # 配置你的远程服务器信息 ORIGIN_REMOTE="git@your-main-server.com" REPO_PATH="/path/to/your/repository.git" BASTION_SERVER="your-bastion-host.com" LOCAL_FORWARD_PORT=2222 # 检查主远程服务器是否可达 check_main_remote() { # 使用SSH测试连接,超时5秒 ssh -T -o ConnectTimeout=5 "$ORIGIN_REMOTE" >/dev/null 2>&1 return $? } # 启动SSH端口转发(仅当端口未被占用时) start_forwarding() { if ! lsof -Pi :"$LOCAL_FORWARD_PORT" -sTCP:LISTEN -t >/dev/null; then ssh -fN -L "$LOCAL_FORWARD_PORT:$ORIGIN_REMOTE:22" "$BASTION_SERVER" echo "SSH port forwarding started: localhost:$LOCAL_FORWARD_PORT -> $ORIGIN_REMOTE" fi } # 主逻辑 if check_main_remote; then echo "Main remote server is reachable, pushing directly..." git push "$@" else echo "Main remote unreachable, switching to port forwarding..." start_forwarding # 临时修改origin的远程URL为本地转发端口 git remote set-url origin "ssh://git@localhost:$LOCAL_FORWARD_PORT$REPO_PATH" # 执行推送(传递所有命令行参数,比如分支名) git push "$@" # 可选:推送完成后恢复原远程URL(根据你的需求决定是否保留此行) # git remote set-url origin "$ORIGIN_REMOTE:$REPO_PATH" fi
步骤2:配置与使用
- 给脚本添加执行权限:
chmod +x git-mypush - 将脚本移动到PATH目录:
mv git-mypush ~/.local/bin/ - 之后使用
git mypush替代原生git push即可,支持传递所有push参数(比如git mypush origin main)
注意事项
- 端口转发会后台运行(
ssh -fN参数),如果需要在推送完成后自动关闭,可以在脚本末尾添加进程清理逻辑(比如通过pkill杀掉对应的SSH进程) - 如果你的堡垒机需要密钥或特定SSH配置,可以在
~/.ssh/config中预先配置,避免脚本中重复输入认证信息 - 若需要处理多个远程仓库,可以修改脚本,通过参数指定目标远程
内容的提问来源于stack exchange,提问作者Matt Pitkin
相关产品推荐
相关产品推荐

