1. 程式人生 > >Git 設置 Hook

Git 設置 Hook

upd 返回 log 其他人 head 整體 you pro 避免

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命令全解析

Git 設置 Hook