# Why is this useful?

# 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.