A simple python script to allow for consistent git commit messages within your project. I tried to keep it short and sweet.
Find a file
2026-06-18 10:34:07 -05:00
.gitignore "test: updated testing to work, also added license + readme" 2026-06-18 09:59:58 -05:00
committy.py fix: remove hard-coded double quotes around subprocess commits, should be for preview only 2026-06-18 10:27:36 -05:00
LICENSE "test: updated testing to work, also added license + readme" 2026-06-18 09:59:58 -05:00
README.md docs: update docs to reflect real url 2026-06-18 10:34:07 -05:00
test_committy.py fix: fix testcases to much updated api 2026-06-18 10:26:14 -05:00

committy

A stupidly simple conventional-commit message builder. You give it flags, it builds a properly formatted commit message and runs git commit for you — no more fat-fingering colons, parens, or forgetting the ! on a breaking change.

Why

Conventional Commits are great until you're typing them out by hand for the hundredth time and forget where the ! goes. committy builds the string for you from flags, so the format is never wrong.

Install

It's a single file — no pip, no virtualenv. Just symlink it onto your $PATH:

git clone https://git.turngear.dev/josh/committy.git
cd committy
chmod +x committy.py
ln -s "$(pwd)/committy.py" ~/.local/bin/committy

Make sure ~/.local/bin is actually on your $PATH (echo $PATH to check — most modern Linux distros add it by default).

That's it. Use it from any repo like a normal command.

Usage

git add .
committy -t feat -s "new email system" -d "This replaces the old XYZ system, cleaner but not compatible" -b "This will NOT work with prev implementations of the email system..."

Builds the message:

feat(new email system)!: This replaces the old XYZ system, cleaner but not compatible  # BREAKING CHANGE: This will NOT work with prev implementations of the email system...

...and runs:

git commit -m "feat(new email system)!: This replaces the old XYZ system, cleaner but not compatible  # BREAKING CHANGE: This will NOT work with prev implementations of the email system..."

Available commit types:

COMMIT_TYPES = [
    "ci",
    "fix",
    "docs",
    "feat",
    "perf",
    "test",
    "build",
    "chore",
    "style",
    "revert",
    "refactor",
]

Flags

Flag Long form Required? Description
-t --type yes Commit type — one of the above mentioned commit types
-d --desc yes The commit description
-s --scope no Scope — renders as type(scope):
-b --breaking no Marks the commit ! and appends a BREAKING CHANGE: footer
-p --preview no Dry run — prints the command instead of running it

Preview before committing

Add -p if you want to see the message without actually committing:

committy -t feat -d "testing this out" -p

Format reference

<type>[(scope)][!]: <description>  [# BREAKING CHANGE: <description>]
  • ! and the BREAKING CHANGE: footer only ever show up together — both are controlled by -b.
  • scope is optional and shows up in parens right after the type.

License

MIT — see LICENSE.