igorsgm/laravel-git-hooks

🪝• 高效管理Laravel项目中的Git钩子。提升代码质量,节省代码审查时间,防止bug进入你的代码库。

1.3.0 2024-04-13 07:30 UTC

This package is auto-updated.

Last update: 2024-09-13 08:17:44 UTC


README

这是一个强大且易于使用的包,用于管理Laravel项目中的Git钩子。提高代码质量,减少代码审查时间,并在bug进入代码库之前捕捉到它们。

Latest Version on Packagist Build Status Test Coverage Code Quality Total Downloads

Laravel Git Hooks usage sample

✨ 特点

  • 预配置钩子:Laravel Git Hooks附带预配置的预提交钩子,适用于Laravel Pint、PHPCS、ESLint、Prettier、Larastan、Enlightn和Blade Formatter等流行工具,使立即实施编码标准和风格指南变得简单。
  • 管理Git钩子:以简化和组织的方式轻松管理你的Laravel项目中的Git钩子。
  • 编辑提交信息:通过自定义它们以符合项目要求并保持干净的Git历史来控制你的提交信息。
  • 创建自定义钩子:添加并集成符合特定项目需求的自定义钩子,确保更好的代码质量和遵循指南。
  • Artisan命令生成钩子:该包包括一个方便的Artisan命令,允许你轻松生成各种类型的钩子。例如:pre-commitprepare-commit-msgcommit-msgpost-commitpre-push
  • 代码质量:该包经过彻底测试,代码覆盖率100%,确保其在各种Laravel项目中的可靠性和稳定性。

1️⃣ 安装

  • 您可以通过composer安装此包
composer require igorsgm/laravel-git-hooks --dev
  • 发布配置文件并根据您的需求进行自定义
php artisan vendor:publish --tag=laravel-git-hooks
  • 现在,每当您更改config/git-hooks.php文件中的更改时,请通过运行Artisan命令来注册您的git钩子
php artisan git-hooks:register

一旦配置并注册了钩子,您就设置完成了!

2️⃣ 通用用法

配置的预提交钩子的使用

要使用此包中已创建的预提交钩子,您只需编辑git-hooks.php配置文件的pre-commit部分。以下是如何配置它们的示例

'pre-commit' => [
    \Igorsgm\GitHooks\Console\Commands\Hooks\PintPreCommitHook::class, // Laravel Pint
    \Igorsgm\GitHooks\Console\Commands\Hooks\PHPCodeSnifferPreCommitHook::class, // PHPCS (with PHPCBF autofixer) 
    \Igorsgm\GitHooks\Console\Commands\Hooks\LarastanPreCommitHook::class, // Larastan
    \Igorsgm\GitHooks\Console\Commands\Hooks\EnlightnPreCommitHook::class, // Enlightn
    \Igorsgm\GitHooks\Console\Commands\Hooks\ESLintPreCommitHook::class, // ESLint
    \Igorsgm\GitHooks\Console\Commands\Hooks\PrettierPreCommitHook::class, // Prettier
],

创建自定义Git钩子

  1. 如果您需要为项目创建自定义Git钩子,Laravel Git Hooks使用git-hooks:make Artisan命令使这变得简单。要创建新的自定义钩子,只需运行以下命令
    php artisan git-hooks:make
    此命令将提示您选择要创建的钩子类型(例如,pre-commitpost-commit等)并为钩子提供一个名称。一旦提供了所需信息,该命令将在app/Console/GitHooks目录中生成新的钩子类。
  2. 要开始使用您的自定义钩子,请打开生成的文件并使用您所需的逻辑实现handle()方法。
  3. 将您的自定义钩子添加到git-hooks.php配置文件中的适当数组
'pre-commit' => [
    // Other pre-commit hooks...
    \App\Console\GitHooks\MyCustomPreCommitHook::class,
],
  1. 最后,通过运行Artisan命令注册您的自定义钩子
php artisan git-hooks:register

3️⃣ 处理Git钩子

预提交钩子

在您输入提交信息之前,首先运行的是提交前钩子。它用于检查即将提交的快照,以查看您是否遗忘了某些内容,以确保测试运行,或检查代码中需要检查的内容。此钩子退出非零状态将终止提交,尽管您可以使用git commit --no-verify绕过它。您可以进行诸如检查代码风格(运行lint或类似工具)、检查尾随空格(默认钩子正好执行此操作)或检查新方法的适当文档等操作。

// config/git-hooks.php
return [
    ...
    'pre-commit' => [
        \App\Console\GitHooks\MyPreCommitHook::class,
    ],
    ...
];
// App/Console/GitHooks/MyPreCommitHook.php

namespace App\Console\GitHooks;

use Closure;
use Igorsgm\GitHooks\Git\ChangedFiles;

class MyPreCommitHook implements \Igorsgm\GitHooks\Contracts\PreCommitHook
{
    // ...

    public function handle(ChangedFiles $files, Closure $next)
    {
        // TODO: Implement your pre commit hook logic here.

        // If you want to cancel the commit, you have to throw an exception.
        // i.e: throw new HookFailException();

        // Run the next hook in the chain
        return $next($files);
    }
}

准备提交信息钩子

在启动提交信息编辑器之前,但创建默认信息之后,运行prepare-commit-msg钩子。它允许您在提交作者看到之前编辑默认信息。此钩子接受一些参数:包含当前提交信息的文件的路径、提交类型以及如果是修订提交的提交SHA-1。此钩子通常对正常提交没有太大帮助;相反,它适用于默认信息自动生成的提交,例如模板提交信息、合并提交、压缩提交和修订提交。您可以使用它结合提交模板以编程方式插入信息。

// config/git-hooks.php
return [
    ...
    'prepare-commit-msg' => [
        \App\Console\GitHooks\MyPrepareCommitMessageHook::class,
    ],
    ...
];
// App/Console/GitHooks/MyPrepareCommitMessageHook.php

namespace App\Console\GitHooks;

use Closure;
use Igorsgm\GitHooks\Git\CommitMessage;
use Igorsgm\GitHooks\Contracts\MessageHook;

class MyPrepareCommitMessageHook implements \Igorsgm\GitHooks\Contracts\MessageHook
{
    // ...

    public function handle(CommitMessage $message, Closure $next)
    {
        // TODO: Implement your prepare commit msg hook logic here.

        $currentMessage = $message->getMessage();
        // You can update commit message text
        $message->setMessage(str_replace('issue', 'fixed', $currentMessage));

        // If you want to cancel the commit, you have to throw an exception.
        // i.e: throw new HookFailException();

        // Run the next hook in the chain
        return $next($message);
    }
}

提交信息钩子

commit-msg钩子接受一个参数,即开发人员编写的提交信息的临时文件的路径。如果此脚本退出非零,Git将终止提交过程,因此您可以使用

// config/git-hooks.php
return [
    ...
    'commit-msg' => [
        \App\Console\GitHooks\MyCommitMessageHook::class,
    ],
    ...
];

commit-msg钩子的类结构与上面所示的prepare-commit-msg钩子相同。

提交后钩子

在完成整个提交过程后,运行post-commit钩子。它不接收任何参数,但您可以通过运行git log -1 HEAD轻松获取最后一个提交。通常,此脚本用于通知或其他类似操作。

// config/git-hooks.php
return [
    ...
    'post-commit' => [
        \App\Console\GitHooks\MyPostCommitHook::class,
    ],
    ...
];
// App/Console/GitHooks/MyPrepareCommitMessageHook.php

namespace App\Console\GitHooks;

use Closure;
use Igorsgm\GitHooks\Git\CommitMessage;
use Igorsgm\GitHooks\Contracts\PostCommitHook;

class MyPostCommitHook implements \Igorsgm\GitHooks\Contracts\PostCommitHook
{
    // ...

    public function handle(Log $log, Closure $next)
    {
        // TODO: Implement post commit hook logic here.

        // You can interact with the commit log
        $hash = $log->getHash();
        $author = $log->getAuthor();
        $date = $log->getDate();
        $message = $log->getMessage();

        // If you want to cancel the commit, you have to throw an exception.
        // i.e: throw new HookFailException();

        // Run the next hook in the chain
        return $next($log);
    }
}

推送前钩子

在git push期间运行pre-push钩子,在更新远程引用之后但传输任何对象之前。它接收远程的名称和位置作为参数,并通过stdin接收要更新的引用列表。您可以在推送发生之前验证一组引用更新(非零退出代码将终止推送)。

// config/git-hooks.php
return [
    ...
    'pre-push' => [
        \App\Console\GitHooks\MyPrePushHook::class,
    ],
    ...
];

pre-push钩子的类结构与上面所示的post-commit钩子相同,但实现\Igorsgm\GitHooks\Contracts\PrePushHook接口。

测试

composer test

变更日志

有关最近更改的更多信息,请参阅CHANGELOG

贡献

有关详细信息,请参阅CONTRIBUTING

鸣谢

许可协议

MIT许可协议(MIT)。有关更多信息,请参阅许可文件