Git 设置 Hook

Git 设置 hook

Hook 就是钩子,在需要的时候调用,根据每个钩子脚本(函数)的返回值决定下一步的操作。

在使用 Git 的过程中,有时候需要定制 Git 以便满足实际的需求。

需求

在一个项目的管理中,需要有一个人负责项目的整体进度。这个人需要有同步 master 分支的权限,
同时为了避免其他人的代码会对 master 分支代码进行错误的操作,其他人不能上传自己本地的代码到服务
器上的 master 分支。

借助 Git 预设的钩子就可以实现这个目的。

思路

  1. 首先要启用服务器上的 Git 钩子。

在服务器上 Git 仓库的目录下,有个 hooks 子目录,这里面存放了一些以 .sample 结尾的脚本文件。把 .sample 后缀去掉就可以启用脚本了。

  1. 在服务器接收提交时调用钩子。

为了在接收提交时触发钩子,启用 Update 钩子。

  1. 对新版本的提交进行检测,符合要求的才允许合并到仓库中。

这里用到了 git log 获得最新提交的用户,尽管这里得到的用户名可能并不是真实的(客户端可以对用户名进行修改),
但一般情况下已经足够阻止不符合要求的提交了。
最后,对于符合要求的提交,脚本返回 0 表示可以接收这次提交,而返回 1 则相反。

代码

#!/bin/bash

refname=$1
oldrev=$2
newrev=$3
user=$USER


permit=0  # false
author=`git log ${newrev} -1 --pretty="%an"`

info() {
	printf "\e[30;42m"
	printf "$1"
	printf "\e[0m\n"
}

warn() {
	printf "\e[30;41m"
	printf "$1"
	printf "\e[0m\n"
}

echo "Enforcing Policiese..."
echo "($refname) (${oldrev:0:6}) (${newrev:0:6})"

# echo "$( g )"
if [ "${refname##refs/heads/}" = "master" ]; then
	warn 'You are pushing repository into Master branch! Make sure you have proper permission. '
	if [ "$author" = 'BriFuture' ]; then
		permit=1   # true
	fi
else
	permit=1  # true
fi

if [ $permit -eq 1 ]; then
	info "Hi $author! Remote is updating repository..."
	exit 0
else
	warn "Hi $author, you are not authorized to push into Branch MASTER! Check your local branch and push command!"
	exit 1
fi

Reference:

  1. Git - Git挂钩
  2. git log命令全解析
posted @ 2018-01-25 23:00  brifuture  阅读(740)  评论(0编辑  收藏  举报