首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

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

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

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语言代码的两个静态检查,如果检查失败,脚本异常退出;如果检查成功,脚本正常退出

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

#!/bin/sh

echo"begin check"

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

echo"begin golint"

golint pkg/...

if[$?-ne];then

exit1

fi

echo"begin go tool vet"

go tool vet pkg/

if[$?-ne];then

exit1

fi

echo"check succ"

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

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

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

begincheck

begingolint

begingo tool vet

pkg/innerdata/build/buildinst/registry/handler.go:22:possible formatting directiveinErrorcall

pkg/pipelinecontroller/instance/sendmail.go:370:possible formatting directiveinErrorcall

pkg/pipelinecontroller/instance/sendmail.go:391:possible formatting directiveinErrorcall

[root@centos cradle]#git status

# On branch testpre

# Changes to be committed:

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

#

# modified: pkg/build/inst.go

#

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

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

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

begincheck

begingolint

begingo tool vet

check succ

[testpre a05d39a]update file

2files changed,3insertions(+)

[root@centos cradle]#git status

# On branch testpre

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

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

[testpre061c348]update file

1file changed,1insertion(+)

[root@centos cradle]#git status

# On branch testpre

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

4、推荐

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

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

  • 发表于:
  • 原文链接http://kuaibao.qq.com/s/20180319B1602T00?refer=cp_1026
  • 腾讯「腾讯云开发者社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。
  • 如有侵权,请联系 cloudcommunity@tencent.com 删除。

扫码

添加站长 进交流群

领取专属 10元无门槛券

私享最新 技术干货

扫码加入开发者社群
领券