• git commit规范&工具安装使用


    一、前言

    Git 每次提交代码,都要写 Commit message(提交说明),否则就不允许提交。基本上写什么都行,但是一般来说,commit message 应该清晰明了,说明本次提交的目的,但是
    很多人平时可能并不重视这个环节,导致commit记录写的很随意,没有发挥其意义与价值。有多种 Commit message 的写法规范。接下来介绍Angular 规范,这是目前使用最广的写法,比较合理和系统化,并且有配套的工具。

    二、Commit message的作用

    • 提供更多的历史信息,方便快速浏览

    比如,下面的命令显示上次发布后的变动,每个commit占据一行。你只看行首,就知道某次 commit 的目的。

    git log <last tag> HEAD --pretty=format:%s

     

    • 可以过滤某些commit,便于筛选代码review

    比如,下面的命令仅仅显示本次发布新增加的功能。

    $ git log <last release> HEAD --grep feature
    • 可以追踪commit生成更新日志

    • 可以关联issues

    三、Git提交说明结构

    Git提交说明可分为三个部分:HeaderBodyFooter

    <type>(<scope>): <subject>
    // 空一行
    <body>
    // 空一行
    <footer>

    Header

    Header部分包括三个字段type(必需)、scope(可选)和subject(必需)。

    <type>(<scope>): <subject>

    Vue源码的提交说明省略了scope

    1、type

    type用于说明 commit 的提交性质。

    描述
    feat 新增一个功能
    fix 修复一个Bug
    docs 文档变更
    style 代码格式(不影响功能,例如空格、分号等格式修正)
    refactor 代码重构
    perf 改善性能
    test 测试
    build 变更项目构建或外部依赖(例如scopes: webpack、gulp、npm等)
    ci 更改持续集成软件的配置文件和package中的scripts命令,例如scopes: Travis, Circle等
    chore 变更构建流程或辅助工具
    revert 代码回退

    2、scope

    scope说明commit影响的范围。scope依据项目而定,例如在业务项目中可以依据菜单或者功能模块划分,如果是组件库开发,则可以依据组件划分。

    提示:scope可以省略。

    3、subject

    subjectcommit的简短描述。

    Body

    是对本次commit的详细描述,说明代码提交的详细说明,可以分成多行。

    Footer

    Footer 部分只用于两种情况。

    1)不兼容变动

    如果当前代码与上一个版本不兼容,则 Footer 部分以BREAKING CHANGE开头,后面是对变动的描述、以及变动理由和迁移方法。

     

    2)关闭 Issue

    如果当前 commit 针对某个issue,那么可以在 Footer 部分关闭这个 issue 。

    Closes #234

    也可以一次关闭多个 issue 。

    Closes #123, #245, #992

    总结:如果代码的提交是不兼容变更或关闭缺陷,则Footer必需,否则可以省略。

    四、Commitizen

    commitizen是一个帮助规范commit message的工具

    提供选择的提交信息类别,快速生成提交说明

    安装 commitizen :

    npm install -g commitizen

    五、Commitizen适配器

    1、cz-conventional-changelog

    如果需要在项目中使用commitizen生成符合AngularJS规范的提交说明,初始化cz-conventional-changelog适配器

    commitizen init cz-conventional-changelog --save-dev --save-exact

    如果当前已经有其他适配器被使用,则会报以下错误,此时可以加上--force选项进行再次初始化

    初始化命令主要进行了3件事情

    1. 在项目中安装cz-conventional-changelog 适配器依赖

    2. 将适配器依赖保存到package.json的devDependencies字段信息

    3. 在package.json中新增config.commitizen字段信息,主要用于配置cz工具的适配器路径: 

    "devDependencies": {
     "cz-conventional-changelog": "^2.1.0"
    },
    "config": {
      "commitizen": {
        "path": "./node_modules/cz-conventional-changelog"
      }
    }

    通过git cz命令代替git commit命令,从而调出如下图的界面,根据界面提示输入 commit 信息并提交。

    2、cz-customizable

    如果想定制项目的提交说明,可以使用cz-customizable适配器:

    安装适配器:

    npm install cz-customizable --save-dev

    将之前符合Angular规范的cz-conventional-changelog适配器路径改成cz-customizable适配器路径:

    "devDependencies": {
      "cz-customizable": "^5.3.0"
    },
    "config": {
      "commitizen": {
        "path": "node_modules/cz-customizable"
      }
    }

    官方提供了一个.cz-config.js示例文件

    'use strict';
    
    module.exports = {
    
      types: [
        {value: '特性',     name: '特性:    一个新的特性'},
        {value: '修复',      name: '修复:    修复一个Bug'},
        {value: '文档',     name: '文档:    变更的只有文档'},
        {value: '格式',    name: '格式:    空格, 分号等格式修复'},
        {value: '重构', name: '重构:    代码重构,注意和特性、修复区分开'},
        {value: '性能',     name: '性能:    提升性能'},
        {value: '测试',     name: '测试:    添加一个测试'},
        {value: '工具',    name: '工具:    开发工具变动(构建、脚手架工具等)'},
        {value: '回滚',   name: '回滚:    代码回退'}
      ],
    
      scopes: [
        {name: '模块1'},
        {name: '模块2'},
        {name: '模块3'},
        {name: '模块4'}
      ],
    
      // it needs to match the value for field type. Eg.: 'fix'
      /*
      scopeOverrides: {
        fix: [
          {name: 'merge'},
          {name: 'style'},
          {name: 'e2eTest'},
          {name: 'unitTest'}
        ]
      },
      */
      // override the messages, defaults are as follows
      messages: {
        type: '选择一种你的提交类型:',
        scope: '选择一个scope (可选):',
        // used if allowCustomScopes is true
        customScope: 'Denote the SCOPE of this change:',
        subject: '短说明:
    ',
        body: '长说明,使用"|"换行(可选):
    ',
        breaking: '非兼容性说明 (可选):
    ',
        footer: '关联关闭的issue,例如:#31, #34(可选):
    ',
        confirmCommit: '确定提交说明?'
      },
    
      allowCustomScopes: true,
      allowBreakingChanges: ['特性', '修复'],
    
      // limit subject length
      subjectLimit: 100
    
    };

    再次使用git cz命令进行提交说明:

    更多:Adapters

    六、Commitizen校验

    1、commitlint

    校验提交说明是否符合规范,当我们运行 git commmit -m 'xxx' 时,用来检查 xxx 是否满足固定格式的工具。安装校验工具commitlint

    npm install -g @commitlint/cli

    @commitlint/config-conventional

    安装符合Angular风格的校验规则

    npm install -g @commitlint/config-conventional  

    在项目中新建commitlint.config.js文件,这个文件就是配置文件,可以设置 commitlint 检查规则。具体规则可以参考这里

    module.exports = {
      extends: ['@commitlint/config-conventional']
    };
    module.exports = {
        extends: ['@commitlint/config-angular'],
        rules: {
            'type-enum': [
                2,
                'always',
                [
                    'WIP',      // 开发中
                    'feat',     // 新特性
                    'improvement', // 加强现有特性
                    'fix',      // 修补bug
                    'refactor', // 重构
                    'docs',     // 文档
                    'test',     // 单元测试
                    'config',   // 配置文件
                    'style',    // 格式需改
                    'perf',     // 性能提升
                    'ci',       // ci
                    'revert',   // 版本回退
                    'chore',    // 其他修改
                ],
            ],
            'type-empty': [2, 'never'],               // type不能为空
            'type-case': [0, 'always', 'lower-case'], // type不限制大小写
            'subject-empty': [2, 'never'],            // subject(简短得描述)不能为空
            'subject-max-length': [1, 'always', 50],  // subject最大长度,超出只会警告,不阻止提交
            'body-leading-blank': [1, 'always'],
            'footer-leading-blank': [1, 'always'],
            'header-max-length': [2, 'always', 72],
          }
    };

    rule配置说明::rule由name和配置数组组成,如:'name:[0, 'always', 72]',数组中第一位为level,可选0,1,2,0为 disable,1为warning,2为error,第二位为应用与否,可选always|never,第三位该rule的值。具体配置例子如下:

    scope:一个可选的修改范围。用于标识此次提交主要涉及到代码中哪个模块。

    description:一句话描述此次提交的主要内容,做到言简意赅。

    husky

    husky是一个可以帮我们设置 git hook 的工具,使用它为我们git commit时添加一个hook,提交时就会触发这个hook,执行 commitlint 自动检查我们提交的 commit message,如果不符合规范,可以阻止提交

    使用husky方法:

    npm install husky --save-dev

    在package.json中配置git commit提交时的校验钩子:

    "husky": {
      "hooks": {
        "commit-msg": "commitlint -E HUSKY_GIT_PARAMS"
      }  
    }

    这段配置告诉了git hooks,当我们在当前项目中执行 git commit -m '测试提交' 时将触发commit-msg事件钩子并通知husky,从而执行 commitlint -E HUSKY_GIT_PARAMS命令,也就是我们刚开始安装的./node_modules/.bin/commitlint,它将读取commitlint.config.js配置规则并对我们刚刚提交的测试提交这串文字进行校验,若校验不通过,则在终端输出错误,commit终止。

    2、validate-commit-msg

    除了使用commitlint校验工具,也可以使用validate-commit-msg校验工具对cz提交说明是否符合Angular规范进行校验。

    参考

    Cz工具集使用介绍 - 规范Git提交说明

    Commit message 和 Change log 编写指南

    git commit规范及自动检查工具安装小记

  • 相关阅读:
    WM平台玩转Android全攻略
    WP7实时监控内存转
    Silverlight内存释放的方法
    .net中同步多个ScrollViewer滚动的四种方法
    windows phone7,zune:can't connect to your phone WP7手机无法连接Zune 的解决方法
    64位虚拟机Guest OS安装错误:0xC0000225
    Tip: Resharper 中 "Unknown Comment" 问题的解决办法
    工具: 删除Visual Studio项目中文件链接,并把原文件复制到相应的目录
    一个代表年月的类YearMonth
    在64bit Win2008上运行Asp + Access网站
  • 原文地址:https://www.cnblogs.com/kunmomo/p/15309565.html
Copyright © 2020-2023  润新知