Why use pre-commit hooks?

Better commit quality = better code quality

The goal of pre-commit hooks is to improve the quality of commits. This is achieved by making sure your commits meet some (formal) requirements, e.g:

  • that they comply to a certain coding style (with the hook style-files).

  • that you commit derivatives such as README.md or .Rd files with their source instead of spreading them over multiple commits.

  • and so on.

Why use the pre-commit framework?

Using hooks from a framework like pre-commit.com has multiple benefits compared to using simple bash scripts locally in .git/hooks or use boilerplate code in other CI services to perform these tasks:

  • Focus on your code. Hooks are maintained, tested and documented outside of your repo, all you need a .pre-commit-config.yaml file to invoke them. No need to c/p hooks from one project to another or maintain boilerplate code.

  • A declarative configuration file for routine checks. File filtering for specific hooks, language version of hooks, when to trigger them (push, commit, merge), configuration options - all controlled via a single configuration file: .pre-commit-config.yaml.

  • Locally and remotely. Or just one of the two. You can use pre-commit locally and in the cloud with pre-commit.ci, where hooks can auto-fix issues like styling and push them back to GitHub. Exact same execution and configuration.

  • Dependency isolation. {precommit} leverages {renv} and hence ensures that anyone who uses the hooks uses the same version of the underlying tools, producing the same results, and does not touch your global R library or anything else unrelated to the hooks.

  • No git history convolution. Pre-commit detects problems before they enter your version control system, let’s you fix them, or fixes them automatically.

  • The power of the crowd. Easily use hooks other people have created in bash, R, Python and other languages. There are a wealth of useful hooks available, most listed here. For example, check-added-large-files prevents you from committing big files, other hooks validate json or yaml files and so on.

  • Extensible.. You can write your own R code to run as a hook, very easily.

  • Standing on the shoulders of giants. Leveraging pre-commit.com drastically reduces complexity and abstracts away a lot of logic that is not R specific for the maintainers of {precommit}.

  • Independent. pre-commit is not bound to GitHub, but runs on your local computer upon commit, and pre-commit.ci will support on other git hosts than GitHub in the future.

Have an idea for a hook? Please file an issue.