ochtra stands for One Commit Hook To Rule All and is an attempt at creating the definitive Git commit hook that:
- Is globally installable for all your repositories
- Aims to keep syntax errors from entering your codebase
- Is not religous about coding style (you still can have your own custom
pre-ochtrahook for that)
ochtra deals with some common pitfalls you'll find in other hooks:
- Works on initial commits
- Will skip files that are staged to be deleted
- Will not run when we're not currently on a branch
- Can co-exist with your current commit hook, just rename it to
- Works on filenames with spaces
- Checks files as staged in Git, not how they're currently saved in your working dir
- Deals with discrepancies between linters sometimes printing errors on STDOUT vs STDERR
Try it now
Without installing anything, you can see ochtra in action on a local test repository:
cd /tmp mkdir test-repo && cd $_ git init curl -s https://raw.githubusercontent.com/kvz/ochtra/master/pre-commit -ko .git/hooks/pre-commit \ && chmod u+x $_ echo ";-)" > syntax-error.go git add syntax-error.go git commit
You'll notice that ochtra won't let you commit that
Phew : ) Now for
.go files it won't typically be a huge problem as your Go project won't run with syntax errors in the first place. But what about making that quick documentation change and leaving a typo? What about that Bash file in your repository? ochtra has got you covered.
As of Git 1.7 you can install ochtra as a git template.
mkdir -p ~/.gittemplate/hooks curl https://raw.githubusercontent.com/kvz/ochtra/master/pre-commit -o ~/.gittemplate/hooks/pre-commit \ && chmod u+x $_ git config --global init.templatedir '~/.gittemplate'
This will make it present in all newly create repositories.
Now, to install/update in existing repositories you can type
cd my-project rm .git/hooks/pre-commit git init # just copies any non-existing files from ~/.gittemplate to current repo
To remove ochtra from one project, type
To remove the automatic installer for new Git repos, type
git config --global --unset init.templatedir # git config --global --remove-section init
To run the tests:
Feel free to report issues, comment on my blog or send a pull requests.
Contributors so far:
- abtris (YAML, JSON & XML support)
- Stefan Näwe (reporting issue)
- mihaeu (reporting issue)
- Mischa ter Smitten (curl fix for githubusercontent when installing)
- Jan Dorsman (fix PHP error logging)
- qdx (fix pipestatus & Git invalid object bug)
- Jostein Kjønigsen (TypeScript support)
- Dan Boulet (HTML support, improve YAML/Git/Go support and tests)
If you already had a
pre-commithook that you want to preserve and have executed before ochtra, just rename it to
If you ever want to commit code and disable the pre-commit one time, type
$ git commit -n
This can be useful if you import big chunks of code that don't pass jshint yet.
- If you want to install linters, have a look at the .travis.yml file, it has instructions for all of them
These pages have been a source of inspiration when building ochtra: