git hook实现代码自动更新

Git提供客户端和服务器端的钩子,在特定操作时执行,如pre-commit用于代码检查,prepare-commit-msg定制提交信息,post-commit发送通知,pre-receive和update在接收到push前运行,post-receive则常用于触发自动化任务。钩子位于.git/hooks目录,需确保其可执行。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Git可以定制一些钩子,这些钩子可以在特定的情况下被执行,分为Client端的钩子和Server端的钩子。Client端钩子被operation触发,比如commit,merge等,Server端钩子被网络动作触发,比如pushed commits。

 

那么钩子是放在哪的呢?
在.git/hooks/文件夹下。当你init一个仓库的时候,下边会有一些钩子的例子,以.sample结尾。

 

那么钩子什么时候被执行,Git预定义了触发时机:
ClientSide hooks:
1 pre-commit,当执行commit动作时先执行此hook,可以用此hook做一些检查,比如代码风格检查,或者先跑测试。
2 prepare-commit-msg, 当commit时需要输入message前会触发此hook,可以用此hook来定制自己的default message信息。
3 commit-msg,当用户输入commit的message后被触发,可以用此hook校验message的信息,比如是否符合规定,有没有cr等。
4 post-commit, 当commit完成后被触发,可以用此hook发送notification等。
5 pre-rebase, rebase之前会被触发,可以用此hook来拒绝所有的已经push的commits进行rebase操作。
6 post-merge, 当merge成功后,会触发此hook。
7 pre-push, 当push时,remote refs被更新,但是在所有的objects传输前被触发。
8 pre-auto-gc, 当git gc --auto执行前被触发。在垃圾回收之前做一些验证或备份是挺不错的。
ServerSide hooks:
1 pre-receive, 当收到push动作之前会被执行。
2 update, 也是收到push动作之前被执行,但是有可能被执行多次,每个branch一次。
3 post-receive, 当push动作已经完成的时候会被触发,可以用此hook来push notification等,比如发邮件,通知持续构建服务器等。

#!/bin/sh
# 修改git项目server端目录下 .git/hooks/post-receive.sample文件,该挂钩在push完结以后运行,取掉.sample启用它,内加入执行脚本,其中变量需修改成两个项目在本机的路径,以我在81服务器上的测试脚本为例:

#zh-jssdk 项目存放路径,需修改
zh_jssdk_pro_path="/home/zhaojianping/weizhan/zh-jssdk/"
#文件夹相对路径,一般不需要修改
zh_jssdk_dir_path="dist/"
#wmp 项目存放路径,需修改
weizhan_wmp_pro_path="/home/zhaojianping/weizhan/wmp/"
#文件夹相对路径,一般不需要修改
weizhan_wmp_dir_path="wmp-webapp/src/main/resources/static/wmp/common/zh-sdk"

cd ${zh_jssdk_pro_path}
unset GIT_DIR
git pull
cd ${weizhan_wmp_pro_path}
unset GIT_DIR
git checkout master
for i in $(git branch -a)
do
notMaster=$(echo $i | grep "master")
remoteBranch=$(echo $i | grep "remotes/origin/")
if [[ "$notMaster"x == ""x ]]
then
        if [[ "$remoteBranch" != "" ]]
        then
        branchName=${i##*/}
        git branch -D ${branchName}
        git checkout "$i" -b ${branchName}
        git pull
        git rm -rf ${weizhan_wmp_dir_path}
        mkdir "$weizhan_wmp_dir_path"
        git commit -m 'Delete old files commit!!--by shell [zh-jssdk push!]'
        cp -rf ${zh_jssdk_pro_path}${zh_jssdk_dir_path}* ${weizhan_wmp_pro_path}${weizhan_wmp_dir_path}
        git add .
        git commit -m 'Update new files commit!!--by shell [zh-jssdk push!]'
        git push
        git checkout master
        git branch -D ${branchName}
        fi
fi
done

记住所有的hook都应该是可被执行的。chmod u+x your_hook

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值