如何在 Composer 项目中管理本地的 Git 钩子?

最后更新于2020-05-22 10:18:16

为什么要使用git钩子?

不知道大家有没有遇到过多人协作开发的时候,有些同学的代码习惯不格式化,甚至有错别字或者低级语法bug,为此我们通常会对自己和别人的代码做一些限制,比如代码风格,代码质量这些。团队协作的时候我们可以通过钩子来防止我们把质量不过关的代码提交到服务器,避免bug发生,比如在pre-commit钩子里面使用php-cs-fixer做一些基础的语法检查和格式化代码,甚至可以加上phpunit执行测试用例的代码,用于防止有bug的代码被提交。

php项目管理git钩子的两种方式

在php项目中,通常可以用以下两种方式来管理git钩子

  1. 直接编辑本地的 .git/hooks/{hook} 文件。

  2. 使用 composer-git-hooks 管理钩子。

两种方式的优缺点

第一种 - 手动改 .git/hooks/{hook}

优点:灵活,不需要依赖composer,任意git项目都可以使用。

缺点:如果在其他环境clone该项目,需要再次手动修改 .git/hooks 目录。

第二种 - 使用 composer-git-hooks 管理

优点:钩子管理起来更方便(毕竟通常IDE会隐藏 .git 目录),可以在各个环境同步钩子代码。

缺点:必须使用composer,其实这个也不算什么缺点了,毕竟composer已经那么普遍了。

composer-git-hooks 的使用

  1. 安装 composer-git-hooks 
$ composer require brainmaestro/composer-git-hooks
  1. 配置 composer.json
"extra": {
        // 省略其他部分...
        "hooks": {
            "pre-commit": [
              "echo committing as $(git config user.name)",
              "vendor/bin/php-cs-fixer fix .",// 语法检查
              "vendor/bin/phpunit" // 执行测试用例
            ]
        }
},
 "scripts": { 
 // 下面这两句加了之后每次composer inistall 和 update都会更新钩子
        "post-install-cmd": "cghooks add --ignore-lock",
        "post-update-cmd": "cghooks update"
    }

同理你也可以在hooks里面添加其他git钩子,git支持以下几种钩子,详细请移步 git钩子

  • applypatch-msg

  • commit-msg

  • fsmonitor-watchman

  • post-update

  • pre-applypatch

  • pre-commit

  • pre-push

  • pre-rebase

  • pre-receive

  • prepare-commit-msg

  • update

需要注意的是,如果composer.json与.git不是在同一个目录下,还需要加--git-dir参数,比如 vendor/bin/cghooks add --git-dir="../.git"

如上操作完成后,你可以手动执行 vendor/bin/cghooks add  或者 composer install来添加钩子。vendor/bin/cghooks 支持 add、update、remove 等几个命令来管理hooks。