Skip to content
Go to file

Latest commit


Git stats


Failed to load latest commit information.
Latest commit message
Commit time


Build Status

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

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 -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:

screen shot 2014-01-07 at 15 18 47

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 -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 to pre-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:


MIT Licensed

You can’t perform that action at this time.