# Installing Git Hooks

> Use when setting up git pre-commit and pre-push hooks - provides simple shell script approach and pre-commit framework method, both calling justfile commands for DRY principle

- Skill: `majiayu000/installing-git-hooks` (Agent Skill, multi-file: 2 files)
- Install (CLI): `npx skillmds@latest add majiayu000/installing-git-hooks`
- Raw SKILL.md: https://api.skillmd.com/api/skills/majiayu000/installing-git-hooks/raw
- Safety review: pending (external: skill-scanner PASS, skillspector CAUTION)
- Works with: Claude Code, Claude.ai, OpenAI Codex
- Category: Coding & Dev Tools
- Author: majiayu000 (https://skillmd.com/u/majiayu000)
- Updated: 2026-09-09
- Page: https://skillmd.com/skills/majiayu000/installing-git-hooks

---


# Installing Git Hooks

## Purpose

Enforce quality checks automatically:
- **Pre-commit:** format, lint, typecheck
- **Pre-push:** test

Hooks call justfile commands (DRY).

## Quick Setup

```bash
cat > .git/hooks/pre-commit << 'EOF'
#!/bin/bash
set -e
echo "Running pre-commit checks..."
just format
just lint
just typecheck
echo "✅ Pre-commit checks passed"
EOF
chmod +x .git/hooks/pre-commit

cat > .git/hooks/pre-push << 'EOF'
#!/bin/bash
set -e
echo "Running pre-push checks..."
just test
echo "✅ Pre-push checks passed"
EOF
chmod +x .git/hooks/pre-push
```

## Justfile Integration

```just
# Install git hooks
hooks:
    @echo "Installing git hooks..."
    @cat > .git/hooks/pre-commit << 'EOF'\n#!/bin/bash\nset -e\necho "Running pre-commit checks..."\njust format\njust lint\njust typecheck\necho "✅ Pre-commit checks passed"\nEOF
    @chmod +x .git/hooks/pre-commit
    @cat > .git/hooks/pre-push << 'EOF'\n#!/bin/bash\nset -e\necho "Running pre-push checks..."\njust test\necho "✅ Pre-push checks passed"\nEOF
    @chmod +x .git/hooks/pre-push
    @echo "✅ Git hooks installed"

hooks-remove:
    rm -f .git/hooks/pre-commit .git/hooks/pre-push
    @echo "✅ Git hooks removed"
```

## Pre-commit Framework

For teams or complex setups:

**`.pre-commit-config.yaml`:**
```yaml
repos:
  - repo: local
    hooks:
      - id: format
        name: Format code
        entry: just format
        language: system
        pass_filenames: false

      - id: lint
        name: Lint code
        entry: just lint
        language: system
        pass_filenames: false

      - id: typecheck
        name: Type check
        entry: just typecheck
        language: system
        pass_filenames: false

      - id: test
        name: Run tests
        entry: just test
        language: system
        pass_filenames: false
        stages: [push]
```

**Install:**
```bash
pip install pre-commit
pre-commit install
pre-commit install --hook-type pre-push
```

## Python with venv

```bash
#!/bin/bash
set -e
source .venv/bin/activate
just format
just lint
just typecheck
```

## Polyglot Projects

```bash
#!/bin/bash
set -e

if git diff --cached --name-only | grep -q "^api/"; then
    cd api && just format && just lint && just typecheck
fi

if git diff --cached --name-only | grep -q "^web/"; then
    cd web && just format && just lint && just typecheck
fi
```

## Best Practices

- **Fast:** Format/lint/typecheck in seconds
- **Fail fast:** Use `set -e` to exit on first error
- **Match CI:** Hooks should match CI checks
- **Document:** Include setup in README/onboarding

## Skipping (Use Sparingly)

```bash
git commit --no-verify -m "message"  # Skip pre-commit
git push --no-verify                 # Skip pre-push
```

## Troubleshooting

**Hook not running:**
```bash
ls -la .git/hooks/pre-commit
chmod +x .git/hooks/pre-commit
head -1 .git/hooks/pre-commit  # Verify shebang
```

**Just not found:**
```bash
#!/bin/bash
export PATH="$HOME/.cargo/bin:$PATH"
set -e
just format
```

**Venv issues:**
```bash
#!/bin/bash
set -e
source .venv/bin/activate
just format
```

