git代码审查以及log规范化的解决方案

前言

公司前端团队百废待兴,很多流程都没有完善起来,这不最近就接到了一个小任务:规范化大家代码提交的格式以及在提交前保证代码的质量。这里的质量并没有做到单元测试覆盖率100%,集成测试全部通过,而是简单地通过语法检查,单元测试的覆盖问题在后续的项目完善中会加进来,所以今天只是讲两点:

  1. log提交格式规范化
  2. Eslint检查100%通过

寻找解决方案

之前在上一家公司做过SVN的代码提交规范化,使用python在SVN服务器上做语法检查,并且在客户端提交log的时候可以自动化的填写格式到log框里然后只需要按照给定的格式来写就行了。

但是git的思想与SVN不一样,git的每次提交都是在本地完成的,只有最后的push才会和服务器交互,所以不可能在服务器这边写脚本来检查。

大家都知道git有hooks的概念,在每个仓库中都有.git/hooks/这个目录,hooks可以在git中指定的一些重要节点上调用对应的钩子函数(文件),一想到这个就觉得应该可以使用这个。

但是后来失望了,因为本地仓库的hooks的代码不能上传到服务器上,大家都共享不了这些配置,并且这些配置在git初始化的时候都是默认的,总不能每次下载代码之后还需要手工去修改这些hooks文件吧。

所以直接使用这个本地的hooks貌似不可行,于是谷歌搜一搜,终于找到一个神器:ghooks

ghooks简单介绍

该软件包是为nodejs打造的,可以帮助我们实现本地的git hooks,支持的git hooks的所有节点,关键它有很简单的配置。其配置在package.json文件中,所以npm有的命令都可以使用

如何规范化log的提交格式

有了ghooks这个神器,那么我们知道只需要在commit-msg的阶段就可以检查提交日志的格式,不符合格式即刻驳回。那么有没有插件可以帮助我们检查代码格式呢?

万能的NPM圈中必然存在这么的,Angular代码提交指定了一套严格的流程,从而衍生出了一些插件来帮助开发者log的规范化,所以这时隆重介绍validate-commit-msg,这款插件正是针对Angular代码提交的规范做的一款检查的插件。

于是我们有了这两款神器,应该可以满足我们的要求了。开始配置:

package.json的配置

我们给出的配置是:(给出的是需要配置的一些需要改的字段)

"scripts": {
    "lint": "eslint ./ --cache --fix --ignore-pattern .gitignore",
    "precommit-msg": "echo Pre-commit checking...please wait && exit 0"
  },
  "config": {
    "validate-commit-msg": {
      "types": [
        "feat",
        "fix",
        "docs",
        "style",
        "refactor",
        "perf",
        "test",
        "chore",
        "revert"
      ],
      "warnOnFail": false,
      "maxSubjectLength": 100,
      "subjectPattern": ".+",
      "subjectPatternErrorMsg": "subject does not match subject pattern!",
      "helpMessage": ""
    },
    "ghooks": {
      "pre-commit": "npm run precommit-msg && npm run lint",
      "commit-msg": "validate-commit-msg"
    }

更加详细的可以参考:demo-for-ghooks

哈哈,貌似大功告成了~~~~

进一步优化

查看Angular给的代码提交规范,可以发现貌似很长的一大段标准,有的时候我们总是记不住格式以及那些字段的含义,那么怎么办呢?

还好git hooks提供了一个重要的节点:prepare-commit-msg,这个节点可以提供给我们在打开git log编辑器之前生成一个默认的git log模板。于是NPM中又有另外一个神器来生成这些信息:prepare-commit-msg-angular

该神器可以生成一个很标准的log模板,如下:

#⎴⎴⎴⎴⎴⎴⎴⎴⎴⎴⎴⎴⎴⎴⎴⎴⎴⎴⎴⎴⎴⎴⎴⎴⎴⎴⎴⎴⎴⎴⎴⎴⎴⎴⎴⎴⎴⎴⎴⎴⎴⎴⎴⎴⎴⎴⎴⎴⎴⎴⎴⎴⎴⎴⎴⎴⎴⎴⎴⎴⎴⎴⎴⎴⎴⎴⎴⎴⎴⎴⎴⎴⎴⎴⎴⎴⎴⎴⎴⎴⎴⎴⎴⎴⎴⎴⎴⎴⎴⎴⎴⎴⎴⎴⎴⎴⎴⎴⎴
# Please enter the commit message for your changes. Lines starting
# with '#' will be ignored, and an empty message aborts the commit.
# On branch develop
# Your branch is up-to-date with 'origin/develop'.
#
# Changes to be committed:
#       modified:   package.json
#
# ------------------------ >8 ------------------------
# <type>(<scope>): <subject>
# <BLANK LINE>
# <body>
# <BLANK LINE>
# <footer>
#---
# TYPE must be one of the following:
# - feat: A new feature (will appear in CHANGELOG)
# - fix: A bug fix (will appear in CHANGELOG)
# - docs: Documentation only changes
# - style: Changes that do not affect the meaning of the code (white-space, formatting, missing semi-colons, etc)
# - refactor: A code change that neither fixes a bug nor adds a feature
# - perf: A code change that improves performance (will appear in CHANGELOG)
# - test: Adding missing tests
# - chore: Changes to the build process or auxiliary tools and libraries such as documentation generation
#
# SCOPE could be anything specifying place of the commit change.
# For example $location, $browser, $compile, $rootScope, ngHref, ngClick, ngView, etc...
#
# SUBJECT contains succinct description of the change:
# - use the imperative, present tense: "change" not "changed" nor "changes"
# - do not capitalize first letter
# - no dot (.) at the end
#---
# https://github.com/ajoslin/conventional-changelog/blob/master/conventions/angular.md

于是你在写日志的时候哪些字段忘记了可以参考下面的提示,如果这个你觉得太麻烦,还有一款可交互的日志填写神器:commitizen

该神器可以交互地提示你填写git log,唯一一个我在应用中觉得缺点的是:每次都是先书写完git log信息后才执行ghooks那些检查,此时如果我的Eslint或者单元测试失败的话那么你刚才写的检查就全白写了。。。。

所以最后就没有集成该插件进去。

该神器的配置可以参考:http://mp.weixin.qq.com/s?__biz=MzAwNDYwNzU2MQ==&mid=401622986&idx=1&sn=470717939914b956ac372667ed23863c&scene=1&srcid=0114ZcTNyAMH8CLwTKlj6CTN#rd

完整的配置可以参考:https://github.com/linxiaowu66/demo-for-ghooks

其中prepare-commit-msg-angular和validate-commit-msg有一个地方不匹配,所以后来自己更新了一下源码,参考:https://github.com/linxiaowu66/prepare-commit-msg-angular

缺点

该方案不支持使用Git UI工具,只能使用命令行来提交代码。所以想使用Git UI工具的请忽略~~~~

参考

  1. http://codeheaven.io/simple-git-hooks-with-ghooks/
  2. https://github.com/cmalard/prepare-commit-msg-angular
  3. https://git-scm.com/book/en/v2/Customizing-Git-Git-Hooks

最后

欢迎访问我的个人博客主页:豆米的博客

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 211,194评论 6 490
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,058评论 2 385
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 156,780评论 0 346
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,388评论 1 283
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,430评论 5 384
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,764评论 1 290
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,907评论 3 406
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,679评论 0 266
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,122评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,459评论 2 325
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,605评论 1 340
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,270评论 4 329
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,867评论 3 312
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,734评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,961评论 1 265
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,297评论 2 360
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,472评论 2 348

推荐阅读更多精彩内容