Ecosyste.ms: Awesome

An open API service indexing awesome lists of open source software.

Awesome Lists | Featured Topics | Projects

https://github.com/jpeer264/node-semantic-git-commit-cli

A CLI for semantic git commits
https://github.com/jpeer264/node-semantic-git-commit-cli

cli commit emoji git nodejs semantic

Last synced: 5 days ago
JSON representation

A CLI for semantic git commits

Awesome Lists containing this project

README

        

# semantic-git-commit-cli

[![Backers on Open Collective](https://opencollective.com/sgc/backers/badge.svg)](#backers) [![Sponsors on Open Collective](https://opencollective.com/sgc/sponsors/badge.svg)](#sponsors)
[![Build Status](https://travis-ci.com/JPeer264/node-semantic-git-commit-cli.svg?branch=master)](https://travis-ci.com/JPeer264/node-semantic-git-commit-cli)
[![Build status](https://ci.appveyor.com/api/projects/status/t9xwo0r3n2oe5ywf/branch/master?svg=true)](https://ci.appveyor.com/project/JPeer264/node-semantic-git-commit-cli/branch/master)
[![Coverage Status](https://coveralls.io/repos/github/JPeer264/node-semantic-git-commit-cli/badge.svg?branch=master)](https://coveralls.io/github/JPeer264/node-semantic-git-commit-cli?branch=master)

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

## 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

```sh
$ npm i -g semantic-git-commit-cli
```
or
```sh
$ yarn global add semantic-git-commit-cli
```

## Usage

Forget the times when you used `git commit -m "..."`, now just type:
```sh
$ sgc
```
or if you already have an alias for sgc, use following instead:
```sh
$ 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:

- `m` | `message`: Add and skip the message block
- `t` | `type`: Add and skip the type block (this has to be defined in the [types](#types) as `argKey`)
- `s` | `scope`: Add and skip the scope block

To skip some questions you can add parameters:

Following:
```sh
$ sgc -t feat -m some new features
```

Will generate: `Feat: some new features`

--

Following:
```sh
$ sgc -t feat -s myScope -m some new features
```

Will generate: `Feat(myScope): some new features`

### Usage with [semantic-release](https://github.com/semantic-release/semantic-release)

> Configure sgc for the following [semantic-release options](https://github.com/semantic-release/semantic-release#plugins): `analyzeCommits` and `generateNotes`

First step, install the following plugins with
```sh
$ npm install --save-dev sr-commit-analyzer sr-release-notes-generator conventional-changelog-eslint
```

or

```sh
$ 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:
```js
/* 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 :
```json
"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**
- `start`: A commit SHA to start, in case you started using `sgc` later of your development

```sh
$ 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):
```
()

```

**Options:**
- [body](#body)
- [scope](#scope)
- [emoji](#emoji)
- [delimiter](#delimiter)
- [lowercaseTypes](#lowercaseTypes)
- [initialCommit](#initialCommit)
- [types](#types)
- [addScopeSpace](#addScopeSpace)
- [rules](#rules)

### body

**Type:** `boolean`

**Default**: `true`

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

Example:
```json
{
"body": false
}
```

### scope

**Type:** `boolean`

**Default:** `false`

Asks for the scope in parentheses of the commit.

Example:
```json
{
"scope": true
}
```

### emoji

**Type:** `boolean`

**Default:** `false`

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

Example:
```json
{
"emoji": true
}
```

### delimiter

**Type:** `string`

**Default:** `:`

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

Example:
```json
{
"delimiter": ":"
}
```
or type specific delimiters, which will overwrite the global one:
```json5
{
"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:
```json
{
"lowercaseTypes": true
}
```

### initialCommit

**Type:** `object`

**Default:**

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

**Keys:**

- `isEnabled` - Whether an explicit initial commit should be used for the very first commit
- `emoji` - An emoji which will be appended at the beginning of the commit ([Emoji Cheat Sheet](https://www.webpagefx.com/tools/emoji-cheat-sheet/))
- `message` - The commit message for the very first commit

### types

> Types will define your git commits. If `types` is not set in your own `.sgcrc`, the `types` of the global [.sgcrc](.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**

- `type` (`string` or `false`) - This will be your commit convention and will be your start of your commit - e.g.: `Feat:`
- `prefix` (optional) - This option is just valid, if `type` is `false`
- `description` (optional) - The description to explain what your type is about
- `emoji` (optional) - An emoji which will be appended at the beginning of the commit ([Emoji Cheat Sheet](https://www.webpagefx.com/tools/emoji-cheat-sheet/))
- `argKeys` | Array (optional) - Keys which will be accessed through the `-t` [parameter](#usage-with-parameters)

The `.sgcrc`:

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

or the `package.json`:

```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 `` and `()`

Example:
```json
{
"addScopeSpace": false
}
```

### rules

Available rules:

- [maxChar](#maxChar)
- [minChar](#minChar)
- [endWithDot](#endWithDot)

#### 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:
```json
{
"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:
```json
{
"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:
```json
{
"rules": {
"endWithDot": false
}
}
```