概述
当我们需要对git提交的相关内容做校验时,可以使用服务端的pre-receive
钩子。相对于客户端的pre-commit
钩子来说,它便于统一管理维护。pre-commit
需要将处理脚本添加到客户端代码仓库的.git/hooks
目录下,当clone后需要重新进行添加,所以通常采用服务端的pre-receive
来替代。
pre-receive
可以对push的内容做校验,如果校验脚本正常退出(exit 0)即允许push,反之会拒绝客户端进行push操作。
服务端配置
- 查看hooks脚本路径
sudo vi /etc/gitlab/gitlab.rb
#gitlab_shell['custom_hooks_dir'] = "/opt/gitlab/embedded/service/gitlab-shell/hooks"
$ll
total 12
-rwxr-xr-x 1 root root 686 Jan 3 07:42 post-receive
-rwxr-xr-x 1 root root 296 Jan 7 19:05 pre-receive
-rwxr-xr-x 1 root root 593 Jan 3 07:42 update
pre-receive
脚本可以是shell、python、ruby等任何可执行脚本,需要注意它的权限。pre-receive
钩子会从标准输入获取三个参数:旧版本号,新版本号,分支。同时还提供了内置的许多环境变量可以使用,详情可以参考官方文档。
- 编写脚本
这里以校验提交内容为例给出示例脚本,仅供参考,更多的示例请查看官方示例。
#!/bin/bash
while read oldVersion newVersion branch; do
echo ${oldVersion}
echo ${newVersion}
echo ${branch}
diff=`git diff --name-status $oldVersion $newVersion`
echo $diff
for file in $diff
do
if [ "${#file}" -lt "2" ];then
continue
fi
echo $file
diffContent=`git show $newVersion:test.txt`
echo $diffContent
#对diff文件内容做校验,如果不符合条件则exit -1
done
done
exit 0
网友评论