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-ochtra
hook 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
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.
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
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
To run the tests:
make test
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-commit
hook 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
These pages have been a source of inspiration when building ochtra: