igorsgm / laravel-git-hooks
🪝• 高效管理Laravel项目中的Git钩子。提升代码质量,节省代码审查时间,防止bug进入你的代码库。
Requires
- php: ^8.1
- illuminate/config: ^9.0|^10.0|^11.0
- illuminate/console: ^9.0|^10.0|^11.0
- illuminate/container: ^9.0|^10.0|^11.0
- illuminate/contracts: ^9.0|^10.0|^11.0
- illuminate/pipeline: ^9.0|^10.0|^11.0
- illuminate/support: ^9.0|^10.0|^11.0
Requires (Dev)
- enlightn/enlightn: ^2.3
- larastan/larastan: ^2.9
- laravel/pint: ^1.2
- mockery/mockery: ^1.5.1
- orchestra/testbench: ^v8.0.0|^v9.0.0
- pestphp/pest: ^2.0
- squizlabs/php_codesniffer: ^3.7
This package is auto-updated.
Last update: 2024-09-13 08:17:44 UTC
README
这是一个强大且易于使用的包,用于管理Laravel项目中的Git钩子。提高代码质量,减少代码审查时间,并在bug进入代码库之前捕捉到它们。
✨ 特点
- 预配置钩子:Laravel Git Hooks附带预配置的预提交钩子,适用于Laravel Pint、PHPCS、ESLint、Prettier、Larastan、Enlightn和Blade Formatter等流行工具,使立即实施编码标准和风格指南变得简单。
- 管理Git钩子:以简化和组织的方式轻松管理你的Laravel项目中的Git钩子。
- 编辑提交信息:通过自定义它们以符合项目要求并保持干净的Git历史来控制你的提交信息。
- 创建自定义钩子:添加并集成符合特定项目需求的自定义钩子,确保更好的代码质量和遵循指南。
- Artisan命令生成钩子:该包包括一个方便的Artisan命令,允许你轻松生成各种类型的钩子。例如:
pre-commit
、prepare-commit-msg
、commit-msg
、post-commit
、pre-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钩子
- 如果您需要为项目创建自定义Git钩子,Laravel Git Hooks使用
git-hooks:make
Artisan命令使这变得简单。要创建新的自定义钩子,只需运行以下命令php artisan git-hooks:make
此命令将提示您选择要创建的钩子类型(例如,pre-commit
、post-commit
等)并为钩子提供一个名称。一旦提供了所需信息,该命令将在app/Console/GitHooks
目录中生成新的钩子类。 - 要开始使用您的自定义钩子,请打开生成的文件并使用您所需的逻辑实现
handle()
方法。 - 将您的自定义钩子添加到git-hooks.php配置文件中的适当数组
'pre-commit' => [ // Other pre-commit hooks... \App\Console\GitHooks\MyCustomPreCommitHook::class, ],
- 最后,通过运行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)。有关更多信息,请参阅许可文件。