ochtra
ochtra copied to clipboard
One Commit Hook To Rule All
ochtra
ochtra stands for One Commit Hook To Rule All and is an attempt at creating the definitive Git commit hook that:
- Works on all your languages (for now Ruby, JavaScript, TypeScript, CoffeeScript, Python, Sh, Bash, Dash, Go, Perl, PHP, XML, JSON, YAML, HTML)
- 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
pre-ochtra - 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 syntax-error.go:

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.
Install
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
Uninstall
To remove ochtra from one project, type
rm .git/hooks/pre-commit
To remove the automatic installer for new Git repos, type
git config --global --unset init.templatedir
# git config --global --remove-section init
Tests
To run the tests:
make test
Contributors
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)
Tips
-
If you already had a
pre-commithook that you want to preserve and have executed before ochtra, just rename it topre-ochtra. -
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
Thanks
These pages have been a source of inspiration when building ochtra:
- http://mark-story.com/posts/view/using-git-commit-hooks-to-prevent-stupid-mistakes
- http://stackoverflow.com/a/8842663/151666
- https://github.com/phpbb/phpbb/blob/develop-olympus/git-tools/hooks/pre-commit
License
MIT Licensed
