Home

Awesome

semantic-git-commit-cli

Backers on Open Collective Sponsors on Open Collective Build Status Build status Coverage Status

A CLI to keep semantic git commits. With emoji support 😄 👍

<img src="https://raw.githubusercontent.com/JPeer264/node-semantic-git-commit-cli/master/media/screenshot.gif">

Why?

Many projects got different git commit rules. It is hard to remember them all. Usually you start with git commit -m ", and then? You have to think about the projects commit guidelines.

sgc will take care of the commit guidelines, so you can focus on the more important stuff: code

Installation

$ npm i -g semantic-git-commit-cli

or

$ yarn global add semantic-git-commit-cli

Usage

Forget the times when you used git commit -m "...", now just type:

$ sgc

or if you already have an alias for sgc, use following instead:

$ semantic-git-commit

Usage with parameters

Note: if any block is added it will get skipped in the questions. If there are still some questions open they will still be asked

Available parameters:

To skip some questions you can add parameters:

Following:

$ sgc -t feat -m some new features

Will generate: Feat: some new features

--

Following:

$ sgc -t feat -s myScope -m some new features

Will generate: Feat(myScope): some new features

Usage with semantic-release

Configure sgc for the following semantic-release options: analyzeCommits and generateNotes

First step, install the following plugins with

$ npm install --save-dev sr-commit-analyzer sr-release-notes-generator conventional-changelog-eslint

or

$ yarn add -D sr-commit-analyzer sr-release-notes-generator conventional-changelog-eslint

Then, create a release.config.js file in a config folder in the root folder of your project:

/* eslint-disable no-useless-escape */
module.exports = {
  analyzeCommits: {
    preset: 'eslint',
    releaseRules: './config/release-rules.js', // optional, only if you want to set up new/modified release rules inside another file
    parserOpts: { // optional, only you want to have emoji commit support
      headerPattern: /^(?::([\w-]*):)?\s*(\w*):\s*(.*)$/,
      headerCorrespondence: [
        'emoji',
        'tag',
        'message',
      ],
    },
  },
  generateNotes: {
    preset: 'eslint',
    parserOpts: { // optional, only you want to have emoji commit support
      headerPattern: /^(?::([\w-]*):)?\s*(\w*):\s*(.*)$/,
      headerCorrespondence: [
        'emoji',
        'tag',
        'message',
      ],
    },
  },
};

Then, update the semantic-release script to your package.json to this :

"scripts": {
    "semantic-release": "semantic-release -e ./config/release.config.js",
}

Commands

check

This will check all commits and will fail if your commits do not meet the defined config.

Flags

$ sgc check --start 84a1abd

Config

Just create a .sgcrc in your project root or you can add everything in your package.json with the value sgc

You can even create a global config. Just go to your users home and create a .sgcrc. The global config will be triggered if no project configurations are present.

The order and namings of the commit (this can vary with different settings):

<type>(<scope>)<delimiter> <message>

<body>

Options:

body

Type: boolean

Default: true

Asks if more info (body) should be added. This will open your default editor.

Example:

{
  "body": false
}

scope

Type: boolean

Default: false

Asks for the scope in parentheses of the commit.

Example:

{
  "scope": true
}

emoji

Type: boolean

Default: false

A boolean to enable emoji at the beginning of a commit message

Example:

{
  "emoji": true
}

delimiter

Type: string

Default: :

A string which is the delimiter between the type and the message.

Example:

{
  "delimiter": ":"
}

or type specific delimiters, which will overwrite the global one:

{
  "delimiter": ":",
  "types": [
    {
      "type": "Feat",
      "delimiter": " -"
    }, // will generate "Feat - message"
    {
      "type": "Fix",
    } // will generate "Fix: message"
  ]
}

lowercaseTypes

Type: boolean

Default: false

A boolean to lowercase types.

Example:

{
  "lowercaseTypes": true
}

initialCommit

Type: object

Default:

{
  "initialCommit": {
    "isEnabled": true,
    "emoji": ":tada:",
    "message": "Initial commit"
  }
}

Keys:

types

Types will define your git commits. If types is not set in your own .sgcrc, the types of the global .sgcrc

Notice: If the type is false it will let you to manually add the type. This is usefull especially if you have a prefix named SGC- to reference these as a ticket number for your ticket tool

Keys

The .sgcrc:

{
    "types": [
      {
        "emoji": ":sparkles:",
        "type": "Feat:",
        "description": "Any description to describe the type",
        "argKeys": ["f", "feat", "feature"]
      }
    ]
}

or the package.json:

{
    "name": "Your application name",
    "version": "1.0.0",
    "sgc": {
        "types": [
            {
              "emoji": ":sparkles:",
              "type": "Feat:",
              "description": "Any description to describe the type",
              "argKeys": ["f", "feat", "feature"]
            }
        ]
    }
}

addScopeSpace

Type: boolean

Default: true

This rule just affects the commit message if scope is set to true

If set to false there will be no space between <type> and (<scope>)

Example:

{
  "addScopeSpace": false
}

rules

Available rules:

maxChar

Type: number

Default: 72

If a number is set, it will not allow to commit messages more than the given number. If it is set to -1 the rule is deactivated

Example:

{
  "rules": {
    "maxChar": -1
  }
}

minChar

Type: number

Default: 10

If a number is set, it will not allow to commit messages less than the given number. If it is set to -1 the rule is deactivated

Example:

{
  "rules": {
    "minChar": -1
  }
}

endWithDot

Type: boolean

Default: true

If it is set to false, it will not allow to commit messages with a dot at the

Example:

{
  "rules": {
    "endWithDot": false
  }
}