Git高级操作: Git钩子 hook 自动部署

Git高级操作: Git钩子

 

Git钩子是一组脚本,这些脚本对应着Git仓库中的特定事件,每一次事件发生时,钩子会被触发。这允许你可以定制化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扩展名。

举例来说,安装一个最简单的prepare-commit-msg钩子脚本。删除.sample扩展名,然后添加如下内容:

#!/bin/sh
echo "# Please include a useful commit message!" > $1

钩子脚本需要可以被执行,所以如果你是从头新建的脚本,可能需要改变文件权限。比如为了确保prepare-commit-msg脚本能够被执行,你需要执行下面你的命令:

chmod +x prepare-commit-msg

经过设置之后你会发现每次执行git commit命令时,上面定制化过的提交信息会作为默认提交信息。我们接下来会在Prepare Commit Message的段落详细审视这是如何工作的。至于现在只需要明白我们是可以通过钩子脚本来定制化Git的某些内部功能。

内置的样例脚本的内容有关于各种钩子可以传递的参数文档,所以可以作为创建新脚本的参考。

 

脚本语言

内置的脚本语言基本上是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提供的这个能力非常强大,这将允许你在创建钩子的时候,使用任何你{xi}惯的脚本语言。

====================

钩子的范围

在指定Git仓库中,钩子都是存在于本地的,它们不会跟随git clone命令被复制到新的仓库中去,所以任何对于当前仓库有权限的人都可以对其进行修改。

这个特性对于为开发团队配置钩子产生了深远的影响。首先,你需要找到一种方式让钩子脚本们在团队成员之间保持同步。其次,你没法强制开发者按照指定方式创建提交——只能鼓励他们这么做。

为整个开发团队维护钩子有点棘手,因为.git/hooks目录不会像项目的其他部分一样被git clone下去,也不在Git的版本管理范畴内。一种简单的解决方案是把钩子文件件放在实际项目目录中(也就是放在.git目录之外)。这样做可以保证他们的行为与其他被版本管理系统管理的文件一样。在这种情况下安装钩子可以对.git/hooks路径创建连接符号(symlink)或者就是简单拷贝黏贴到.git/hooks路径下。

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章