«

Git 钩子

时间:2024-2-21 13:25     作者:韩俊     分类: Linux


Git钩子是一组脚本,这些脚本对应着Git仓库中的特定事件,每一次事件发生时,钩子会被触发。这允许你可以定制化Git的内部行为,在开发周期中的关键点上触发执行定制化的脚本。

概念概述

所有的Git钩子都是Git在某个特定事件发生时会执行的脚本。所以其实非常容易安装并配置。

钩子可以配置在本地或者服务端仓库,他们也只会在某些特定动作执行时被触发。我们会在后面的部分讨论钩子的类别。本节的内容可以应用于本地或者服务端。

安装钩子

钩子脚本文件通常放置于项目目录的.git/hooks文件夹下。Git会在初始化项目时自动在这个文件夹下放置一些样例脚本。如果你查看.git/hooks文件夹下,会找到如下的文件:

applypatch-msg.sample       pre-push.sample
commit-msg.sample           pre-rebase.sample
post-update.sample          prepare-commit-msg.sample
pre-applypatch.sample       update.sample
pre-commit.sample

这些文件基本上涵盖了可以使用的钩子,只不过.sample扩展名不会让脚本内容生效。安装一个钩子最简单的方式就是删除.sample扩展名。或者如果你从头开始写好了一个钩子脚本,只需要将其命名为上面所列的文件名并去除.sample扩展名。

脚本语言

内置的脚本语言基本上是shell或者perl脚本,但是实际上你可以使用任何能够作为可执行脚本运行的语言。脚本文件的第一行(#!/bin/sh)定义了应该使用哪种脚本解释器。所以要使用其他的语言,只需要将第一行改为新的执行器的路径即可。

举个例子,我们通过修改脚本解释器路径,让prepare-commit-msg文件执行Python脚本而不是shell命令。

#!/usr/bin/env python

import sys, os

commit_msg_filepath = sys.argv[1]
with open(commit_msg_filepath, 'w') as f:
    f.write("# Please include a useful commit message!")

注意第一行被修改为Python脚本的解释器。以及我们没有使用$1(shell方式)来获取第一个参数的引用,而是使用了sys.argv[1](python方式)(下面会详细解释这个地方)

Git提供的这个能力非常强大,这将允许你在创建钩子的时候使用任何你习惯的脚本语言。

本地钩子

本地钩子只会影响本地仓库。既然你已经读到这里,想必一定会记得每个开发者自己可以修改本地钩子,所以无法将其作为一种提交规范强制执行。不过它们可以让开发者能够更方便地遵循某种指导方针。

在本小节,我们会介绍6中最常用的本地钩子:

pre-commit

prepare-commit-msg

commit-msg

post-commit

post-checkout

pre-rebase
在git rebase执行之前被触发,在此时机可以进行检查以避免发生破坏性的事情。

前四个可以用于提交的完整生命周期,后两个用于执行在git checkout和git rebase之后的安全检查。

所有pre-开头的钩子都是在实际动作执行前会被触发,post-开头的则是在实际动作执行之后被触发。

接下来我们还会需要使用一些底层的Git命令来解析钩子参数或者查询仓库信息。

示例:

1.仓库更新了更新本地代码:

cp hooks/post-update.sample hooks/post-update
vim hooks/post-update

输入如下代码:

#!/bin/bash

unset GIT_DIR
cd /home/www/phpernote
git reset --hard origin
git pull

标签: linux

热门推荐