---
title: Pre-commit hooks
slug: docs/pre-commit-hooks
docTags: 
createdAt: 2024-04-18T13:59:47.085Z
---

## Using pre-commit hooks

Pre-commit hooks are a useful way to prevent secrets in code from being pushed from a git repository. Preventing them from being leaked in the first place is always the best approach.&#x20;

If you run your own git server, consider the [pre-receive hook](docId:84n9z_iTulB2670bKUTSs)  option which can block commits with secrets from being accepted.

This guide covers how to set up TruffleHog as a pre-commit hook using two popular frameworks:

1. Git's hooksPath feature - A built-in Git feature for managing hooks globally
2. Using Pre-commit framework - A language-agnostic framework for managing pre-commit hooks
3. Using Husky - A Git hooks manager for JavaScript/Node.js projects

## Prerequisites

All of the methods require TruffleHog to be installed.

1. Install TruffleHog:

:::CodeblockTabs{indent="1"}
```bash
# Using Homebrew (macOS)
brew install trufflehog

# Using installation script for Linux, macOS, and Windows (and WSL)
curl -sSfL https://raw.githubusercontent.com/trufflesecurity/trufflehog/main/scripts/install.sh | sh -s -- -b /usr/local/bin
```
:::

## Global setup using Git's hooksPath feature

This approach uses Git's `core.hooksPath` to apply hooks to all repositories without requiring any per-repository setup:

1. Create a global hooks directory:

:::CodeblockTabs{indent="1"}
```bash
mkdir -p ~/.git-hooks
```
:::

2. Create a pre-commit hook file:

:::CodeblockTabs{indent="1"}
```bash
touch ~/.git-hooks/pre-commit
chmod +x ~/.git-hooks/pre-commit
```
:::

3. Add the following content to `~/.git-hooks/pre-commit`:

:::CodeblockTabs{indent="1"}
Using local binary

```bash
#!/bin/sh

trufflehog git file://. --since-commit HEAD --results=verified,unknown --fail
```

Using Docker

```bash
#!/bin/sh

docker run --rm -v "$(pwd):/workdir" -i --rm trufflesecurity/trufflehog:latest git file:///workdir --since-commit HEAD --results=verified,unknown --fail
```
:::

4. Configure Git to use this hooks directory globally:

:::CodeblockTabs{indent="1"}
```bash
git config --global core.hooksPath ~/.git-hooks
```
:::

Now all your repositories will automatically use this pre-commit hook without any additional setup.

## Using the Pre-commit Framework

The [pre-commit framework](https://pre-commit.com) is a powerful, language-agnostic tool for managing Git hooks.

### Installation of Pre-commit

1. Install the pre-commit framework:

:::CodeblockTabs{indent="1"}
```bash
# Using pip (Python)
pip install pre-commit

# Using Homebrew (macOS)
brew install pre-commit

# Using conda
conda install -c conda-forge pre-commit
```
:::

### Repository-Specific Setup

To set up TruffleHog as a pre-commit hook for a specific repository:

1. Create a `.pre-commit-config.yaml` file in the root of your repository:

:::CodeblockTabs{indent="1"}
Using local binary

```yaml
repos:
  - repo: local
    hooks:
      - id: trufflehog
        name: TruffleHog
        description: Detect secrets in your data.
        entry: bash -c 'trufflehog git file://. --since-commit HEAD --results=verified,unknown --fail'
        language: system
        stages: ["commit", "push"]
```

Using Docker

```yaml
repos:
  - repo: local
    hooks:
      - id: trufflehog
        name: TruffleHog
        description: Detect secrets in your data.
        entry: bash -c 'docker run --rm -v "$(pwd):/workdir" -i --rm trufflesecurity/trufflehog:latest git file:///workdir --since-commit HEAD --results=verified,unknown --fail'
        language: system
        stages: ["commit", "push"]
```
:::

2. Install the pre-commit hook:

:::CodeblockTabs{indent="1"}
```bash
pre-commit install
```
:::

## Using Husky

[Husky](https://typicode.github.io/husky/) is a popular tool for managing Git hooks in JavaScript/Node.js projects.

### Installation of Husky

1. Install Husky in your project:

:::CodeblockTabs{indent="1"}
```bash
# npm
npm install husky --save-dev

# yarn
yarn add husky --dev
```
:::

2. Enable Git hooks:

:::CodeblockTabs{indent="1"}
```bash
# npm
npx husky init
```
:::

### Setting Up TruffleHog with Husky

1. Add the following content to `.husky/pre-commit`:

:::CodeblockTabs{indent="1"}
Using local binary

```bash
echo "trufflehog git file://. --since-commit HEAD --results=verified,unknown --fail" > .husky/pre-commit
```

Using Docker

```bash
echo 'docker run --rm -v "$(pwd):/workdir" -i --rm trufflesecurity/trufflehog:latest git file:///workdir --since-commit HEAD --results=verified,unknown --fail' > .husky/pre-commit
```
:::

## Best Practices

### Commit Process

For optimal hook efficacy:

1. Execute `git add` followed by `git commit` separately. This ensures TruffleHog analyzes all intended changes.
2. Avoid using `git commit -am`, as it might bypass pre-commit hook execution for unstaged modifications.

### Skipping Hooks

In rare cases, you may need to bypass pre-commit hooks:

```bash
git commit --no-verify -m "Your commit message"
```

## Troubleshooting

### Hook Not Running

If your pre-commit hook isn't running:

1. Ensure the hook is executable:

:::CodeblockTabs{indent="2"}
```bash
chmod +x .git/hooks/pre-commit
```
:::

2. Check if hooks are enabled:

:::CodeblockTabs{indent="2"}
```bash
git config --get core.hooksPath
```
:::

### False Positives

If you're getting false positives:

1. Use the `--results=verified` flag to only show verified secrets
2. Add `trufflehog:ignore` comments on lines with known false positives or risk-accepted findings

## Conclusion

By integrating TruffleHog into your pre-commit workflow, you can prevent credential leaks before they happen. Choose the setup method that best fits your project's needs and development workflow.

For more information on TruffleHog's capabilities, refer to the [main documentation](https://github.com/trufflesecurity/trufflehog).
