尧图网站设计 尧图网站设计YAOTU DESIGN
ARTICLE DETAIL

资讯详情

深耕网站设计与一线实操的经验洞察。

腾讯云服务器 git pull 连不上 GitHub?别急着换镜像,一个 32KB 的 bundle 文件就够了

腾讯云服务器 git pull 连不上 GitHub?别急着换镜像,一个 32KB 的 bundle 文件就够了 前言我有一台腾讯云轻量服务器上面跑着几个小站代码托管在 GitHub 上部署流程一直是标准三件套cd/home/ubuntu/myappgitpullpm2 restart myapp用了几天都好好的直到某天更新时突然报错fatal: unable to access https://github.com/xxx/xxx.git/: GnuTLS recv error (-110): The TLS connection was non-properly terminated.重试一次换了个报错fatal: unable to access https://github.com/xxx/xxx.git/: Failed to connect to github.com port 443 after 134618 ms: Could not connect to server注意第二个报错等了 134 秒才超时。也就是说不是配置问题是网络层面根本握不上手——国内服务器访问 GitHub 的老毛病时好时坏昨天还能克隆今天就彻底连不上。网上的主流方案是换 gitee 镜像、或者给 git 挂代理。但镜像要维护同步代理要有节点都很重。后来我找到了一个被严重低估的方案git bundle。整个更新过程只花了一分钟因为提交包只有 32KB。先说结论git bundle可以把本地任意范围的提交打包成一个单文件离线仓库scp 传到服务器后服务器直接从这个文件git pull。它和远程 pull 的效果完全等价提交历史不丢、commit hash 不变、远端 origin 不用改下次网络恢复照样git pull。完整操作步骤第 1 步本地打包要传的提交假设服务器现在停在abc1234本地已经领先了 3 个提交# 打包 abc1234 之后的所有提交gitbundle create /tmp/update.bundle abc1234..main三个细节abc1234..main表示从 abc1234 到 main 的增量包体积很小我那次只有 32KBabc1234必须是服务器上已有的提交可以用git rev-parse --short HEAD在服务器上先查一下如果不确定范围想打全量也行git bundle create /tmp/update.bundle --all就是包会大一些第 2 步传到服务器scp-iyour_key.pem /tmp/update.bundle ubuntuyour_server_ip:/tmp/第 3 步服务器从 bundle 拉取cd/home/ubuntu/myappgitpull /tmp/update.bundle main输出和普通 pull 一模一样From /tmp/update.bundle * branch main - FETCH_HEAD Updating 6be1a6d..91198f1 Fast-forward tools/vigenere.html | 120 tools/xor.html | 98 2 files changed, 218 insertions()然后正常重启服务pm2 restart myapp第 4 步验证 清理gitlog--oneline-3# 确认新提交进来了rm/tmp/update.bundle# 清理临时文件为什么 bundle 比镜像/代理更适合个人部署方案成本缺点gitee 镜像要维护双向同步两个远端容易乱私有仓库同步麻烦git 挂代理需要稳定节点服务器上常驻代理本身就有风险git bundle零配置一条 scp手动操作但见下方自动化bundle 方案的本质是国内连接不稳的是到 GitHub 的路而不是 git 协议本身。既然我和服务器之间 scp 一直很稳那就把拉取这一步挪到我这边来做服务器只收结果。自动化把整个流程收进一个函数把下面这段加进本地~/.bashrcWindows 用 Git Bash 的也一样deploy_bundle(){localremote_headremote_head$(ssh-i$1$2cd$3 git rev-parse --short HEAD)||return1gitbundle create /tmp/deploy.bundle${remote_head}..main||return1scp-i$1-q/tmp/deploy.bundle$2:/tmp/deploy.bundle||return1ssh-i$1$2cd$3 git pull /tmp/deploy.bundle main rm /tmp/deploy.bundle}以后更新就是一条命令deploy_bundle ~/.ssh/my_key ubuntu1.2.3.4 /home/ubuntu/myapp几个容易踩的坑1. 服务器 HEAD 和本地打包基准对不上会报错如果服务器上有人手动改过代码哪怕只是git stash没弹干净pull bundle 时可能冲突。部署前先在服务器上跑git status确认是干净的。2. 别用git clone /tmp/update.bundlebundle 可以直接 clone但那会把你的部署目录整个换掉目录里的数据文件数据库、上传文件、限流记录全丢。只 pull不 clone。3. 顺带一提git pull 报 GnuTLS 错误也可能是 DNS 污染可以先nslookup github.com看解析结果是否正常。如果解析正常但 443 握手超时那就是我文中这种间歇性失联bundle 是最快的解法。总结个人项目部署到国内云服务器git pull连不上 GitHub 不用大动干戈本地git bundle create打增量包scp传上去服务器git pull bundle文件 main32KB 的包、一分钟的操作、零配置残留。这个方法我目前已经跑了很久GitHub 通不通都能更新。如果这篇文章帮到了你点个赞让更多被 GnuTLS 错误折磨的同学看到。
返回列表