Git Hooks: Enhance Your Development Workflows

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/hookspre-commitpost-commitchmod +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 钩子

在这里,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 中也提到过:

结论

Git Hooks 是一个强大的工具,可以帮助您自动执行任务、实施编码标准和改进您的工作流程。通过使用 Git Hooks,您可以节省时间、提高代码质量并确保您的团队遵循最佳实践。我希望这篇文章能很好地介绍一下 Git Hooks,并启发你开始在你的项目中使用它们。

暂无评论

发送评论 编辑评论


				
|´・ω・)ノ
ヾ(≧∇≦*)ゝ
(☆ω☆)
(╯‵□′)╯︵┴─┴
 ̄﹃ ̄
(/ω\)
∠( ᐛ 」∠)_
(๑•̀ㅁ•́ฅ)
→_→
୧(๑•̀⌄•́๑)૭
٩(ˊᗜˋ*)و
(ノ°ο°)ノ
(´இ皿இ`)
⌇●﹏●⌇
(ฅ´ω`ฅ)
(╯°A°)╯︵○○○
φ( ̄∇ ̄o)
ヾ(´・ ・`。)ノ"
( ง ᵒ̌皿ᵒ̌)ง⁼³₌₃
(ó﹏ò。)
Σ(っ °Д °;)っ
( ,,´・ω・)ノ"(´っω・`。)
╮(╯▽╰)╭
o(*////▽////*)q
>﹏<
( ๑´•ω•) "(ㆆᴗㆆ)
😂
😀
😅
😊
🙂
🙃
😌
😍
😘
😜
😝
😏
😒
🙄
😳
😡
😔
😫
😱
😭
💩
👻
🙌
🖕
👍
👫
👬
👭
🌚
🌝
🙈
💊
😶
🙏
🍦
🍉
😣
Source: github.com/k4yt3x/flowerhd
颜文字
Emoji
小恐龙
花!
上一篇
下一篇