干货|使用git中钩子文件做代码提交前的检查

点击上方“中兴开发者社区”,关注我们

每天读一篇一线开发者原创好文

640?wx_fmt=png&wxfrom=5&wx_lazy=1

1、场景和问题

日常开发中,代码合入流程一般是:先修改代码,提交代码到gerrit,通过CI检查和人工code-review之后,代码合入版本库。CI上一般会配置一些代码格式规范,单元测试覆盖率,圈复杂度之类的检查。

有时本地提交的代码,到CI检查报错了,查看原因,再本地修改提交,再提代码重做CI,比较麻烦。但是每次提交前手工执行这些检查命令或者脚本等容易忘记,且比较麻烦。


2、git钩子脚本

在.git/hooks目录中,有多种钩子文件,大部分文件都是以.sample为后缀,是示例文件,不生效。去掉.sample后缀才会生效。 

其中有个pre-commit.sample文件,这个钩子在执行"git commit"命令时被调用,而且可以通过在命令中添加 --no-verify参数来跳过。这个钩子没有参数,在得到提交消息和开始提交前被调用。如果钩子执行结果是非零,那么"git commit"命令就会中止执行,文件不会被提交。

默认的'pre-commit'钩子里实现的是检查非ascii文件名,例如:如果有中文命名的文件,就会报错。不过pre-commit里面默认的功能,一般我们不需要,我们可以自己重新编写这个pre-commit脚本文件,添加我们自己需要的一些检查即可。


3、实践举例

例如:简单的实现对go语言代码的两个静态检查,如果检查失败,脚本异常退出;如果检查成功,脚本正常退出

 
   
  1. [root@centos cradle]# cat .git/hooks/pre-commit

  2. #!/bin/sh

  3.  

  4. echo "begin check"

  5. cd /root/go/src/gitlab.zte.com.cn/dev/cradle/

  6. echo "begin golint"

  7. golint pkg/...

  8. if [ $? -ne 0 ];then

  9.     exit 1

  10. fi

  11. echo "begin go tool vet"

  12. go tool vet pkg/

  13. if [ $? -ne 0 ];then

  14.     exit 1

  15. fi

  16. echo "check succ"

a、钩子执行失败的情况:代码没被提交

修改文件并git add,然后执行git commit进行提交,从打印可以看出先执行了pre-commit脚本,脚本检查失败,git status查看,文件没有被提交

 
   
  1. [root@centos cradle]# git commit -"update file"

  2. begin check

  3. begin golint

  4. begin go tool vet

  5. pkg/innerdata/build/buildinst/registry/handler.go:22: possible formatting directive in Error call

  6. pkg/pipelinecontroller/instance/sendmail.go:370: possible formatting directive in Error call

  7. pkg/pipelinecontroller/instance/sendmail.go:391: possible formatting directive in Error call

  8. [root@centos cradle]# git status

  9. # On branch testpre

  10. # Changes to be committed:

  11. #   (use "git reset HEAD ..." to unstage)

  12. #

  13. #       modified:   pkg/build/inst.go

  14. #

b、钩子执行成功的情况:代码被成功提交

执行git commit进行提交,先执行pre-commit脚本,脚本成功后,提交成功

 
   
  1. [root@centos cradle]# git commit -"update file"

  2. begin check

  3. begin golint

  4. begin go tool vet

  5. check succ

  6. [testpre a05d39a] update file

  7.  2 files changed, 3 insertions(+)

  8. [root@centos cradle]# git status

  9. # On branch testpre

c、如果本次不关心检查的错误,则可以加上 参数--no-verify,本次commit就跳过pre-commit脚本检查

 
   
  1. [root@centos cradle]# git commit -"update file" --no-verify

  2. [testpre 061c348] update file

  3.  1 file changed, 1 insertion(+)

  4.  

  5. [root@centos cradle]# git status

  6. # On branch testpre

git commit --amend命令也会执行pre-commit脚本


4、推荐

1、易用性:只要写好pre-commit脚本,不需要其他操作,在执行git commit命令时会自动执行,简单易用

2、实用性:添加一些CI中的静态检查,在每次提交的时候,默认做基本的静态检查,这样可以在提交到gerrit前过滤掉一些问题,不至于到CI上运行失败了再打patch修改

640?wx_fmt=png

你可能感兴趣的:(干货|使用git中钩子文件做代码提交前的检查)