Giter VIP home page Giter VIP logo

mogh's Introduction

[1.0.0] ๐Ÿ—๏ธ MOGH - The Magic Of Git Hooks

Easily configurable git hooks templates without bullshit

Keep it simple, stupid Pull request are open License: GPL 3.0 Made with fun

The reason of this project, is that some Git Hooks usually have no interest in being checked out AFTER a push (like with github actions). Checking the format, preventing the commit of certain information or files, etc. All this stuff should be checked locally to prevent mistake and leave no trace of it in the history.

This type of tool already exists, but it's extremely heavy and has many dependencies (like with npm, python, etc.). This is not the case here, it's just bash script that uses the default tools of a Unix like system and to be easily configurable with the git config command.

๐Ÿง  Systems supported

  • Gnu/Linux
  • Windows
  • macOS
  • BSD (need to validate posix compatibility)

๐Ÿงช Features

  • Can be configured with git config globally or locally see configuration
  • Colored Error and Success message output
  • Unit testing for each hook
  • emoji type support for commit message
  • Check and Auto-fix commit message format
  • Check and Auto signoff when missing if required
  • Check and Auto pgp singing when missing if required
  • Avoid duplicate commits message
  • Avoid to commit binary files with auto or interactive fix
  • Avoid to commit large files with auto or interactive fix
  • Support of DNCT (Do Not Commit This) tags in files
  • Prevent the commit of the mac ds_store ...
  • Prevent pushing to remote branches that is not up-to-date with local branches
  • Prevent pushing commit with WIP tag
  • Prevent commit when previous commit is a WIP
  • Require a .gitignore file to be present in the root of the repository
  • Emit a warning if potential sensitive information is found in a file
  • Branch naming convention
  • Branch protection rules
  • Enforce --force-with-lease instead of --force

๐Ÿ’ป Usage

These scripts are automatically used by Git according to the actions taken, like every githooks and comforming to the githooks manual page.

You can disable MOGH hooks for a specific project with the dedicated option. Like this:

git config mogh.enabled 0

Or you can skip it one with the git --no-verify flag for push actions.

๐Ÿ“ฆ Dependencies

To work properly, these scripts don't require any exta dumb tools like npm, python or other crap. Requirements are probably by default on your system.

  • git of course ...
  • printf to format a string
  • bash this is an sh-compatible shell
  • grep searching plain-text data sets for lines
  • file checking file type
  • stat checking file size
  • sed parses and transforms text
  • tr operation of replacing or removing specific characters
  • jq (only for unit testing) JSON processor

๐Ÿ“ฅ Installation

To install it, just run the following command:

curl -sL https://raw.githubusercontent.com/IGLOU-EU/mogh/master/tools/install.sh | bash

That will clone the repository to your git templates directory and enable it to the global git hooks.
This is not a destructive operation, if you already have a git hook installed it will not be overwritten but moved to hooks.old.

Or you can install it manually by running something like this:

mkdir -p ~/.git/templates
git clone https://github.com/IGLOU-EU/mogh.git ~/.git/templates/hooks
git config --global init.templatedir ~/.git/templates

Update โ™ป๏ธ

To update it, just run the following command:

curl -sL https://raw.githubusercontent.com/IGLOU-EU/mogh/master/tools/update.sh | bash

That will globally made an git pull to the repository to update the templates. If the repository is not cloned yet, it returns an error.

Update repository ๐Ÿช

To update hooks in a repository, run the following command on it:

git init

According to the documentation, this can update repository.

Create an empty Git repository OR reinitialize an existing one

๐Ÿ“ Configuration

The configuration use the default git config file, so you can change it with the git command git config. By default, the configuration is applied only to the current git repository, but you can apply it globally with the --global flag option. For more information, see the documentation.

Local configuration overrides global configuration, except for lists, like mogh.types.extra and mogh.types.extra-emoji. There use "all values for a multi-valued key" from both configurations like an union of the two lists.

This is a config example, to full config see the next section

# add extra type support to global config
git config --global mogh.types.extra "poop"
git config --global mogh.types.extra "mock"
git config --global mogh.types.extra "break"

# add extra emoji support to global config
git config --global mogh.types.extra-emoji "๐Ÿ’ฉ"
git config --global mogh.types.extra-emoji "๐Ÿคก"
git config --global mogh.types.extra-emoji "๐Ÿ’ฅ"

# enable the type replacement to emoji
# but only to the current repository
git config mogh.types.emoji 1

Take your git config and fill it to your needs ๐ŸŽ‰

TOML config ๐Ÿ“‹

This is the git config representation of how the default MOGH configuration applied for hooks.

[mogh]
	enabled = 1
    gitignore = 1
[mogh "dnct"]
	enabled = 1
	regex = \\[DNCT\\]|DONOTCOMMITTHIS|DO-NOT-COMMIT-THIS|DO_NOT_COMMIT_THIS|DO NOT COMMIT THIS
[mogh "files"]
	size-max = 1024
	uncache-oversize = 2
	uncache-dsstore = 1
	uncache-binary = 2
[mogh "gpg"]
	required = 1
	autofix = 1
[mogh "header"]
	autofix = 1
	max-length = 80
[mogh "types"]
	emoji = 2
[mogh "signoff"]
	required = 1
	autofix = 1
[mogh "wip"]
	prevent-push = 1
	secure-commit = 1
[mogh "branch"]
	protected = 0
	protected-push = 0
	protected-name = "main|master"

Detailed config ๐Ÿ“‘

mogh.enabled

To enable or disable MOGH hooks.

Can be set to 0 or 1. Default is 1.

mogh.gitignore

To enable or disable the gitignore requirement.

Can be set to 0 or 1. Default is 1.

mogh.dnct.enabled

To enable or disable the dnct tag checker. This tag DO NOT COMMIT THIS is used to prevent the commit of sensitive data.

Can be set to 0 or 1. Default is 1.

mogh.dnct.regex

To set the dnct tag regex. This is the regex to match the dnct tag.

Default is \[DNCT\]|DONOTCOMMITTHIS|DO-NOT-COMMIT-THIS|DO_NOT_COMMIT_THIS|DO NOT COMMIT THIS

mogh.files.uncache-dsstore

To enable or disable the ds_store remover. When you work with mac guys ...

Can be set to 0 or 1. Default is 1.

mogh.files.uncache-binary

To enable or disable the binary file remover. This flag is used to prevent the commit of executable binaries.

Can be set to 0, 1, 2. Default is 2.
0: keep it; 1: remove from commit; 2: interactive fix.

mogh.files.size-max

To set the maximum file size to be committed. This flag is used to prevent the commit of large files.

Can be set to a KB value. Default is 1024.

mogh.files.uncache-oversize

To enable or disable the file size autofix.

Can be set to 0, 1, 2. Default is 2.
0: keep it; 1: remove from commit; 2: interactive fix.

mogh.gpg.required

To enable or disable GPG signing requirement.
This flag will force user to use git -S, --gpg-sign

Can be set to 0 or 1. Default is 1.

mogh.gpg.autofix

To enable or disable automatic GPG signature fixing.
This flag will try to automatically apply the gpg signature to the commit.

Can be set to 0 or 1. Default is 1.

mogh.header.autofix

To enable or disable automatic header fixing.
This flag will try to automatically fix the header of the commit. According to the conventionalcommits.org v1.

Can be set to 0 or 1. Default is 1.

mogh.header.max-length

To set the maximum length of the commit header. This flag is used to prevent the commit of too long header.

Can be set to a number. Default is 80.

mogh.types.extra

To add extra commit type to the list of supported types.
By default, all commit type from conventionalcommits.org v1 are available.

Default is an empty list.
Can be added with git config --global mogh.types.extra "poop"

mogh.types.emoji

To enable or disable the emoji type support.
The idea is to use the emoji type instead of the type name. This is largely inspired by gitmoji.dev.

Can be set to 0, 1, 2. Default is 2.
0: disable; 1: enable; 2: enable but keep the type name.

mogh.types.extra-emoji

To add extra emoji commit type to the list of supported types.
In case you have added extra commit type to the list and whant corresponding emoji, you need to add them here. Warning, the position id in the array is used to map the commit type to emoji, so you need to keep the same order.

Default is an empty list.
Can be added with git config --global mogh.types.extra-emoji "๐Ÿ’ฉ"

mogh.signoff.required

To enable or disable the signoff requirement.
This flag will force user to use git -s, --signoff

Can be set to 0 or 1. Default is 1.

mogh.signoff.autofix

To enable or disable automatic signoff fixing.
This flag will try to automatically add the signoff to the commit. It use git variable GIT_AUTHOR_NAME and GIT_AUTHOR_EMAIL to generate it.

Can be set to 0 or 1. Default is 1.

mogh.wip.prevent-push

To enable or disable the WIP tag push prevention.
This flag will prevent the push of a commit with the WIP tag.

Can be set to 0 or 1. Default is 1.

mogh.wip.secure-commit

To enable or disable the prevention of commit when previous commit is a WIP.
This flag is to keep the history clean of WIP commits.

Can be set to 0 or 1. Default is 1.

mogh.branch.protected

To enable or disable the branch protection.
This flag will prevent the commit on a protected branch.
Particularly useful when your distante repository not support branch protection.

Can be set to 0 or 1. Default is 0.

mogh.branch.protected-push

To enable or disable the branch protection push.
This usefull to prevent allowing or not independently of commiting on a protected branch.

Can be set to 0 or 1. Default is 0.
Note: By default, this flag is set to the value of mogh.branch.protected.

mogh.branch.protected-name

To define a regex to match with the branches you wish to protect.
Example: release\/[0-9]+\.[0-9]+ will protect all branches like release/1.0, release/2.0, etc.

Default is main|master.

๐Ÿค Contributing

For contribute to this project, follow these steps:

  1. Fork this repository.
  2. Clone it to your local machine.
  3. Remove the .git/hooks directory of the cloned repository rm -rf .git/hooks.
  4. Create a symbolic link to THIS clone ln -s "$(pwd)" "$(pwd)/.git/hooks".
  5. Create a new branch with the feature, fix... name like git checkout -b feature/feature-name.
  6. Commit, push and create a pull request ! ๐ŸŽ‰

If you have any questions, feel free to ask. And do not forget to sign your commits.

๐Ÿงช Testing

Every hook has its own unit test (if not, I have missed it).

If you need to write a test. These are located in the tests directory and have the same name as the hook with the .test extension, you need to make it executable with chmod +x tests/commit-msg.test and cases are defined in json format.

To run them, you need to have jq installed. Then you can run it like every other bash script. Like:

./tests/commit-msg.test

๐Ÿ“œ License

This project is licensed under the GPL 3.0 License - see the LICENSE file for details.

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    ๐Ÿ–– Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. ๐Ÿ“Š๐Ÿ“ˆ๐ŸŽ‰

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google โค๏ธ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.