关于git:定义全局Git-Hooks和自定义Git-Hooks

42次阅读

共计 2014 个字符,预计需要花费 6 分钟才能阅读完成。

提醒 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_HOOK
fi

if [-f  "$CUSTOM_HOOK"]; then
    source $CUSTOM_HOOK
fi

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)/hooks
endif

update-git-hooks: install-git-hooks
    cd $(REPO_GIT)/gromithooks && git pull

执行如下指令能够实现我的项目的配置。

# 装置
make install-git-hooks

# 更新
make update-git-hooks

参考

  • 本文章源码 Donespeak/Gromithooks
  • 8.3 自定义 Git – Git 钩子 @git-scm

正文完
 0