Ubuntu Git服务器Push后,如何触发独立Web服务器自动拉取master分支?
跨机场景下Git Push后Web服务器自动拉取Master分支的实现方案
嘿,这个跨机自动部署的需求我太熟了——好多团队从同机换成跨机架构后都会遇到这个问题。核心逻辑其实就是让Git服务器在收到Push后,主动触发Web服务器上的代码拉取操作,下面我给你拆解成一步步可落地的步骤:
第一步:搞定跨机免密SSH登录(关键前提)
要让Git服务器能远程执行Web服务器的命令,首先得实现免密登录,不然每次Push都要输密码,完全达不到自动的效果:
- 切换到Git服务器上运行Git服务的用户(通常是
git用户),执行命令生成SSH密钥对:
一路按回车就行,不用设密码,这样才是真正的免密。ssh-keygen -t ed25519 - 把Git服务器上生成的公钥(路径是
~/.ssh/id_ed25519.pub)内容复制出来,粘贴到Web服务器上部署代码的目标用户(比如www-data,或者你专门建的部署用户)的~/.ssh/authorized_keys文件里。 - 测试一下:在Git服务器上执行
ssh 部署用户名@Web服务器IP,如果能直接登录Web服务器而不需要输入密码,这步就搞定了。一定要确保这步能成功,不然后面的自动操作全白搭
第二步:在Git服务器配置Post-Receive Hook
Git的hooks机制是核心,我们要利用post-receive这个钩子,在Push完成后触发远程拉取:
- 找到你的Git仓库的hooks目录,一般是
你的仓库路径/.git/hooks/ - 新建一个名为
post-receive的文件(注意没有任何后缀),把下面的内容粘进去,记得替换成你自己的实际信息:#!/bin/bash # 只监听master分支的Push操作 while read oldrev newrev refname do # 解析当前Push的分支名称 branch=$(git rev-parse --symbolic --abbrev-ref $refname) # 如果是master分支,触发Web服务器拉取 if [ "$branch" = "master" ]; then # 替换成你的Web服务器信息和项目路径 ssh 部署用户名@Web服务器IP 'cd /你的Web项目根目录 && git pull origin master' fi done - 给这个脚本加上执行权限,不然Git没法运行它:
chmod +x post-receive
第三步:权限与安全细节(别踩坑)
这部分很容易忽略,搞不好会导致拉取失败或者有安全隐患:
- 确保Web服务器上的部署用户对项目目录有读写权限,不然
git pull会因为权限不足报错。 - 为了安全,限制Git服务器用户的SSH权限:在Web服务器的
authorized_keys文件里,给Git服务器的公钥加上命令限制,比如只允许执行拉取代码的命令,防止恶意操作。格式大概是:command="cd /你的Web项目根目录 && git pull origin master",no-port-forwarding,no-X11-forwarding,no-agent-forwarding,no-pty 这里粘贴Git服务器的公钥内容 - 建议给钩子脚本加日志功能,方便排查问题。比如把命令的输出重定向到日志文件:
记得提前创建日志目录和文件,给Git用户写权限。ssh 部署用户名@Web服务器IP 'cd /你的Web项目根目录 && git pull origin master' >> /var/git/hooks/logs/post-receive.log 2>&1
第四步:测试验证
最后一步就是验证效果:
- 在你的本地开发机上,修改点代码,然后推送到Git服务器的master分支:
git push origin master - 去Web服务器的项目目录看看代码是不是已经更新了,或者查看日志文件有没有报错信息。如果一切顺利,就大功告成了!
内容的提问来源于stack exchange,提问作者Eng.Helewa
相关产品推荐
相关产品推荐

