Git Hooks:增强您的开发工作流程
Git Hooks 是在某些 Git 命令之前或之后自动运行的脚本。它们是一个强大的工具,可以帮助你自动化任务、执行编码标准和改进你的工作流程。本文将向你介绍 Git Hooks,并告诉你如何使用它们来增强你的开发过程。
什么是 Git Hooks?
Git Hook 是 Git 在某些命令之前或之后运行的脚本。它们存储在 Git 存储库的目录中,并在您运行 Git 命令时自动执行。Git Hook 有几种类型,每种类型对应于 Git 工作流程中的不同命令或事件。.git/hooks
例如,Pre-commit 钩子在将更改提交到仓库之前运行。它们可用于强制执行编码标准、运行测试或执行其他任务以确保代码质量。另一方面,Post-commit 钩子在您提交更改后运行,可用于发送通知、更新问题跟踪器或执行其他任务。
这些钩子脚本仅受您的想象力限制,可用于自动化您能想到的几乎任何任务。它们是一个强大的工具,可以帮助您改进工作流程、实施最佳实践并节省时间。
如何使用 Git Hook
要使用 Git Hooks,你需要创建一个脚本并将其保存在你的 Git 仓库的目录中。脚本应该以你想使用的钩子命名(例如,、 、 等),并且应该是可执行的,并且应该具有适当的权限(例如,)。.git/hooks
pre-commit
post-commit
chmod +x pre-commit
以下是可用 Git Hook 的完整列表:
-
applypatch-msg
:在应用修补程序之前执行,以编辑修补程序的提交消息。 -
pre-applypatch
:在应用补丁之前运行,可用于验证补丁完整性。 -
post-applypatch
:在应用补丁后执行,通常用于通知。 -
pre-commit
:在 commit 进程开始之前运行,通常用于 linting 或测试。 -
prepare-commit-msg
:在提交消息编辑器启动之前运行,以自定义消息。 -
commit-msg
:在创建提交消息后运行,以便对提交消息进行其他检查。 -
post-commit
:提交完成后执行,通常用于通知或日志记录。 -
pre-rebase
:在 rebase 进程开始之前运行,可用于验证 rebase 是否可以继续。 -
post-checkout
:在执行签出后运行,通常用于配置工作目录。 -
post-merge
:在合并完成后运行,通常用于通知或清理。 -
pre-receive
:在处理推送到服务器之前运行,用于实施策略。 -
update
:在推送期间运行以更新引用,通常用于实施特定于分支的策略。 -
post-receive
:在处理到服务器的推送后执行,用于通知或部署。 -
post-update
:在服务器上更新引用后运行,对于存储库维护任务非常有用。 -
pre-auto-gc
:在自动垃圾回收之前运行,通常用于防止不需要的 GC。 -
post-rewrite
:在 git commit --amend 或 git rebase 等命令之后运行,以调整更改。 -
pre-push
:在推送到远程存储库之前执行,通常用于验证推送内容。
请注意,所有这些钩子(如果默认存在)都作为文件存储在目录中。您必须删除扩展才能激活它们并使它们可执行。.sample
.git/hooks
.sample
示例:Pre-commit Hook
下面是一个简单的 pre-commit 钩子示例,用于检查代码中的空格错误:
#!/bin/sh
# Check if this is the initial commit
if git rev-parse --verify HEAD >/dev/null 2>&1
then
echo "pre-commit: About to create a new commit..."
against=HEAD
else
echo "pre-commit: About to create the first commit..."
against=4b825dc642cb6eb9a060e54bf8d69288fbee4904
fi
# Use git diff-index to check for whitespace errors
echo "pre-commit: Testing for whitespace errors..."
if ! git diff-index --check --cached $against
then
echo "pre-commit: Aborting commit due to whitespace errors"
exit 1
else
echo "pre-commit: No whitespace errors :)"
exit 0
fi
下面提到了 pre-commit 钩子的另一个示例。此钩子验证 git config 的全局用户电子邮件并检查 gpg 密钥是否存在。该钩子很有用,因此提交包含正确的提交者电子邮件地址,并确保提交已签名。
#!/bin/bash
PWD=pwd
globalEmail=git config --global --get user.email
signingKey=git config --global --get user.signingkey
workEmail="[email protected]"
if [[ $PWD != "*demo*" && $globalEmail != $workEmail ]];
then
echo "Commit email and global git config email differ"
echo "Global commit email: "$globalEmail""
echo "Committing email expected: $workEmail"
exit 1
elif [[ $signingKey -eq "" ]];
then
echo "No signing key found. Check global gitconfig"
exit 1
else
echo ""
exit 0
fi
请记住通过运行使脚本可执行,并将其保存在 Git 存储库的目录中。chmod +x pre-commit
.git/hooks
这是它的样子:
在这里,pre-commit 钩子尝试检查用户的电子邮件地址是否设置为特定值。如果电子邮件地址未设置为预期值,则提交中止。在我的情况下,预期的电子邮件地址是,但我使用不同的电子邮件地址登录。因此,提交被中止。[email protected]
脚本语言
你可以用任何你熟悉的脚本语言编写 Git Hooks,比如 Bash、Python、Ruby 或 Perl。唯一的要求是脚本应该是可执行的,并且应该有适当的权限。
用 Python 编写的钩子示例:prepare-commit-msg
#!/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!")
示例:Post-commit Hook
下面是一个用 Python 编写的简单 post-commit 钩子的示例,它在提交后发送电子邮件通知:
#!/usr/bin/env python
import smtplib
from email.mime.text import MIMEText
from subprocess import check_output
# Get the git log --stat entry of the new commit
log = check_output(['git', 'log', '-1', '--stat', 'HEAD'])
# Create a plaintext email message
msg = MIMEText("Look, I'm actually doing some work:nn%s" % log)
msg['Subject'] = 'Git post-commit hook notification'
msg['From'] = '[email protected]'
msg['To'] = '[email protected]'
# Send the message
SMTP_SERVER = 'smtp.example.com'
SMTP_PORT = 587
session = smtplib.SMTP(SMTP_SERVER, SMTP_PORT)
session.ehlo()
session.starttls()
session.ehlo()
session.login(msg['From'], 'secretPassword')
session.sendmail(msg['From'], msg['To'], msg.as_string())
session.quit()
这可能不是从 Git Hook 发送电子邮件通知的最佳方式,但它可以让你了解什么是可能的。
使用 Git Hook 的项目
以下是一些使用 Git Hooks 来自动化任务和改进工作流程的项目,这些项目在 githooks.com 中也提到过:
-
Lolcommits - 每次 git commit 代码时,使用网络摄像头拍摄快照,并使用它存档 lolcat 样式的图像。
-
Husky - Node.js的 Git 钩子,从您的 package.json 管理您的钩子。
-
podmena - 通过添加随机表情符号来增强你的提交消息。
-
overcommit - 维护良好、最新、灵活的 Git 钩子管理器。
结论
Git Hooks 是一个强大的工具,可以帮助您自动执行任务、实施编码标准和改进您的工作流程。通过使用 Git Hooks,您可以节省时间、提高代码质量并确保您的团队遵循最佳实践。我希望这篇文章能很好地介绍一下 Git Hooks,并启发你开始在你的项目中使用它们。