写点什么

定义全局 Git Hooks 和自定义 Git Hooks

用户头像
DoneSpeak
关注
发布于: 3 小时前

提示 21

Use the Power of Command Shells

利用命令 shell 的力量

--《程序员修炼之道 - 从小工到专家》

写在前面

一个 git 项目只有一个 hooks 目录,每个阶段 hook 文件也只有一个,这样会造成开发人员和公司全局 hooks 的配置冲突。为了实现全局 Git Hooks 和开发人员自定义 Hooks,特写了该简易项目。

全局 Hooks 和自定义 Hooks

项目结构

├── Makefile # make 安装指令├── global   #保存全局的hooks│   ├── applypatch-msg.sample│   ├── commit-msg.sample│   ├── fsmonitor-watchman.sample│   ├── post-update.sample│   ├── pre-applypatch.sample│   ├── pre-commit.sample│   ├── pre-merge-commit.sample│   ├── pre-push.sample│   ├── pre-rebase.sample│   ├── pre-receive.sample│   ├── prepare-commit-msg.sample│   └── update.sample├── customized # 开发人员自定义hooks目录├── applypatch-msg├── commit-msg├── fsmonitor-watchman├── hook-exec # hook 执行核心├── post-update├── pre-applypatch├── pre-commit├── pre-merge-commit├── pre-push├── pre-rebase├── pre-receive├── prepare-commit-msg└── update
复制代码

核心文件 hook-exec

该文件负责将global/<hook>customized/<hook>绑定到一个<hook>。如果想进行更多目录的拓展,更多同阶段 hooks 的拓展,可以对该文件进行修改。


hook-exec


#!/bin/bash
HOOK_DIR=$(dirname "$0")GLOBAL_HOOK="$HOOK_DIR/global/$HOOK_NAME"CUSTOM_HOOK="$HOOK_DIR/customized/$HOOK_NAME"
if [ -f "$GLOBAL_HOOK" ]; then source $GLOBAL_HOOKfi
if [ -f "$CUSTOM_HOOK" ]; then source $CUSTOM_HOOKfi
复制代码

git hook 执行文件

根目录下的 hook 文件都是一样的,目的是为了将 hook 的文件名HOOK_NAME以及所有参数$@都传入到hook-exec中,从而实现全局和自定义 hook 的调用,并确保原本的参数可以正常使用。


hook name


#!/bin/bash
HOOK_NAME=$(echo $0 | sed 's/.*\///')
source $(dirname "$0")/hook-exec $@
复制代码

Makefile 实现指令安装

fork 该文章的项目gromithooks到自己的仓库,并将全局的 githooks 保存到项目的global/目录下,其中的customized/则可以存放开发人员自己的 githooks。


将下方的 Makefile 文件复制到 git 项目的根目录下,即可通过 make 指令完成 multi hooks 的初始化和更新。(替换 git@gitlab.com:DoneSpeak/gromithooks.git 为 fork 之后的项目地址)


Makefile


REPO := $(PWD)REPO_GIT := $(REPO)/.git
install-git-hooks: .git/hooks/hook-exec
.git/hooks/hook-exec:ifeq ($(wildcard $@),) cd $(REPO_GIT) && git clone git@gitlab.com:DoneSpeak/gromithooks.git mv $(REPO_GIT)/hooks/* $(REPO_GIT)/gromithooks/git-hooks/multi-hooks/customized/ rm -rf $(REPO_GIT)/hooks ln -s $(REPO_GIT)/gromithooks/git-hooks/multi-hooks $(REPO_GIT)/hooksendif
update-git-hooks: install-git-hooks cd $(REPO_GIT)/gromithooks && git pull
复制代码


执行如下指令可以完成项目的配置。


# 安装make install-git-hooks
# 更新make update-git-hooks
复制代码

参考

发布于: 3 小时前阅读数: 2
用户头像

DoneSpeak

关注

Let the Work That I've Done Speak for Me 2018.05.10 加入

Java后端开发

评论

发布
暂无评论
定义全局Git Hooks和自定义Git Hooks