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的更多相关文章

  1. git 利用hook 实现服务器自动更新代码

    如何利用git的hook实现提交代码后自动更新? 因为个人开发经常需要提交代码,每次都需要连接服务器去pull代码,重启服务器就显得十分繁琐,因此github提供了一个时间钩子,用户push代码后可以 ...

  2. git 设置多项目实现多账号登陆

    9:45 2015/11/18git 设置多项目时实现多账号用户登陆git config --global user.name "your_name" git config --g ...

  3. git pre-push hook

    This article introduces git pre-push hook. Problem In Lean project, we use a modified version of Goo ...

  4. vscode git设置

    vscode只能打开一下界面: 在setting.path增加git.path选项,再使用linux的方法配置路径,就是使用D:/../bin/git.exe而不是\\ 重启vscode,git设置即 ...

  5. cmd/git设置alias提高效率

    cmd设置alias 在cmd或者git中有有些命令是比较长的,却需要频繁的使用,那么我们就可以设置alias来简化操作,无形中减少大量的宝贵时间,具体步骤如下. 第一步: 创建cmd_alias.b ...

  6. 转:git设置过滤忽略的文件或文件夹

    from: https://www.cnblogs.com/foohack/p/4629255.html git设置过滤忽略的文件或文件夹   我们一般向代码仓库提交项目的时候,一般需要忽略编译生成的 ...

  7. git设置HTTP代理

    git设置HTTP代理 设置HTTP代理 如果公司使用代理,git就需要设置代理才能克隆远程仓库 执行下面两条语句 git config --global http.proxy 10.167.32.1 ...

  8. git设置core.autocrlf

    背景: 使用虚拟机共享windows文件夹,文件夹中用git clone 一个仓库.在linux下编辑文件,用git status发现几乎所有的文件都为修改状态.   原因: windows下和lin ...

  9. git 设置代理.

    git 设置代理:(因为网络有时太慢,需要用到 ss 代理..) git config --global http.proxy http://127.0.0.1:1080 取消 代理 git conf ...

随机推荐

  1. .Net Core Api 使用版本控制

    1,安装Microsoft.AspNetCore.Mvc.Versioning NET Core Mvc中,微软官方提供了一个可用的Api版本控制库Microsoft.AspNetCore.Mvc.V ...

  2. SingleClass单例类

    前言 对于一个单例类,无论初始化单例对象多少次,在程序的整个生命周期内,只会创建一个类的实例对象,而且只要程序不被杀死,该实例对象就不会被释放,并且该对象是全局的,能够被整个系统访问到. 在应用这个模 ...

  3. SP34096 DIVCNTK - Counting Divisors (general)(Min_25筛)

    题面 洛谷 \(\sigma_0(i)\) 表示\(i\) 的约数个数 求\(S_k(n)=\sum_{i=1}^n\sigma_0(i^k)\mod 2^{64}\) 多测,\(T\le10^4,n ...

  4. LVS+OSPF 架构(转)

    http://blog.51cto.com/pmghong/1399385 LVS 和 LVS+keepalived 这两种架构在平时听得多了,最近才接触到另外一个架构LVS+OSPF.这个架构实际上 ...

  5. 10.15 lzxkj

    几天前写的,忘了放了,在此填坑 10月16的题我出的不写题解了 lzxkj 题目背景 众所不周知的是, 酒店之王 xkj 一个经常迷失自我的人 有一天, 当起床铃再一次打响的时候, TA 用 O(1) ...

  6. 项目笔记《DeepLung:Deep 3D Dual Path Nets for Automated Pulmonary Nodule Detection and Classification》(三)(下)结果评估

    在(上)中讲了如何得到csv文件并调用noduleCADEvaluationLUNA16.py求取froc值,这里就讲一讲froc值是如何求取的. annotations_filename = './ ...

  7. SprimgMVC学习笔记(五)—— Controller方法返回值

    一.返回ModelAndView controller方法中定义ModelAndView对象并返回,对象中可添加model数据.指定view. /** * 查询商品列表 * @return */ @R ...

  8. P4245 【模板】任意模数NTT

    Luogu4245 只要做三次的NTT,快的飞起 普通NTT,做9次 #include<cstdio> #include<cstring> #include<iostre ...

  9. 在基于AngularJs架构的ABP项目中使用UEditor

    [前提须知] 读过此篇博客 了解angular-ueditor 了解ABP如何使用 会使用VS2017 [1.下载ABP模板] https://aspnetboilerplate.com/Templa ...

  10. P4824 [USACO15FEB]Censoring (Silver) 审查(银)

    传送门 一个串的匹配肯定考虑KMP 那就暴力KMP 记录一下到每个字符时匹配的位置 找到一个符合的串就标记然后暴力回跳 感觉好像太暴力了... #include<iostream> #in ...