配置Git钩子实现远程Ubuntu服务器自动Git Pull
实现本地Git推送后远程Ubuntu服务器自动拉取代码
我来帮你搞定这个自动拉取的问题!之前用post-receive钩子没成功,大概率是配置细节没做好——比如仓库类型不对、钩子没加执行权限,或者脚本路径写错了。下面一步步来:
1. 在远程服务器创建裸仓库(关键!)
非裸仓库直接接收推送容易出问题,而且钩子的执行逻辑也会受影响,所以先建一个专门用来接收推送的裸仓库:
- SSH登录到你的Ubuntu服务器:
ssh your-username@your-server-ip - 创建裸仓库目录(路径自己选,比如
/opt/my-project.git):mkdir -p /opt/my-project.git cd /opt/my-project.git git init --bare
2. 配置post-receive钩子
裸仓库的hooks目录里默认有示例文件,我们需要创建可执行的post-receive脚本:
- 进入钩子目录:
cd /opt/my-project.git/hooks - 创建
post-receive文件并编辑:
写入以下内容(替换成你的实际路径):nano post-receive#!/bin/bash # 你的生产代码存放目录(绝对路径) TARGET_DIR="/path/to/your/production/folder" # 强制拉取最新代码到生产目录 git --work-tree=$TARGET_DIR --git-dir=/opt/my-project.git checkout -f main注意:把
main换成你实际使用的分支名(比如master)
3. 给钩子脚本添加执行权限
这是很多人忽略的一步!没有执行权限的话,Git不会触发这个钩子:
chmod +x post-receive
4. 本地仓库关联远程裸仓库
回到你的本地电脑,把刚才创建的裸仓库设为远程仓库:
git remote add production ssh://your-username@your-server-ip/opt/my-project.git
之后推送代码时,直接推到这个远程仓库:
git push production main
常见问题排查
如果还是没生效,检查这几点:
- 权限问题:确保你的服务器用户对
TARGET_DIR有读写权限,比如可以手动在服务器上touch /path/to/your/production/folder/test.txt测试 - 路径错误:脚本里的所有路径必须是绝对路径,别用相对路径(比如
../production这种) - 脚本语法错误:手动执行脚本看看有没有报错:
cd /opt/my-project.git/hooks && ./post-receive,根据错误提示修正 - 分支匹配:脚本里的分支名要和你推送的分支一致,比如你推的是
dev,脚本里也要改成checkout -f dev
内容的提问来源于stack exchange,提问作者Skully
相关产品推荐
相关产品推荐

