---
title: "Why is this useful?"
output: rmarkdown::html_vignette
description: > 
  Understand why we build this and why we think it's useful.
vignette: >
  %\VignetteIndexEntry{why-use-hooks}
  %\VignetteEncoding{UTF-8}
  %\VignetteEngine{knitr::rmarkdown}
editor_options: 
  markdown: 
    wrap: 72
---

# 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](https://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](https://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](https://pre-commit.com/hooks.html). 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](https://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](https://pre-commit.ci) will support on other git
    hosts than GitHub in the future.

Have an idea for a hook? Please [file an
issue](https://github.com/lorenzwalthert/precommit/issues).
