Files
beads/examples/git-hooks/README.md
Steve Yegge 0344e1f08b Fix bd-51: Add git hooks to eliminate auto-flush race condition
- Added --flush-only flag to bd sync command
- Created pre-commit hook to flush pending changes before commit
- Created post-merge hook to import changes after pull/merge
- Added install script for easy setup
- Updated AGENTS.md with git hooks workflow
- Resolves race condition where daemon auto-flush fires after commit

Amp-Thread-ID: https://ampcode.com/threads/T-00b80d3a-4194-4c75-a60e-25a318cf9f91
Co-authored-by: Amp <amp@ampcode.com>
2025-10-24 22:17:06 -07:00

2.6 KiB

bd Git Hooks

This directory contains git hooks that integrate bd (beads) with your git workflow, solving the race condition between daemon auto-flush and git commits.

The Problem

When using bd in daemon mode, operations trigger a 5-second debounced auto-flush to JSONL. This creates a race condition:

  1. User closes issue via MCP → daemon schedules flush (5 sec delay)
  2. User commits code changes → JSONL appears clean
  3. Daemon flush fires → JSONL modified after commit
  4. Result: dirty working tree showing JSONL changes

The Solution

These git hooks ensure bd changes are always synchronized with your commits:

  • pre-commit - Flushes pending bd changes to JSONL before commit
  • post-merge - Imports updated JSONL after git pull/merge

Installation

Quick Install

From your repository root:

./examples/git-hooks/install.sh

This will:

  • Copy hooks to .git/hooks/
  • Make them executable
  • Back up any existing hooks

Manual Install

cp examples/git-hooks/pre-commit .git/hooks/pre-commit
cp examples/git-hooks/post-merge .git/hooks/post-merge
chmod +x .git/hooks/pre-commit .git/hooks/post-merge

How It Works

pre-commit

Before each commit, the hook runs:

bd sync --flush-only

This:

  1. Exports any pending database changes to .beads/issues.jsonl
  2. Stages the JSONL file if modified
  3. Allows the commit to proceed with clean state

The hook is silent on success, fast (no git operations), and safe (fails commit if flush fails).

post-merge

After a git pull or merge, the hook runs:

bd import -i .beads/issues.jsonl --resolve-collisions

This ensures your local database reflects the merged state. The hook:

  • Only runs if .beads/issues.jsonl exists
  • Automatically resolves ID collisions from branch merges
  • Warns on failure but doesn't block the merge

Compatibility

  • Auto-sync: Works alongside bd's automatic 5-second debounce
  • Direct mode: Hooks work in both daemon and --no-daemon mode
  • Worktrees: Safe to use with git worktrees

Benefits

No more dirty working tree after commits
Database always in sync with git
Automatic collision resolution on merge
Fast and silent operation
Optional - manual bd sync still works

Uninstall

Remove the hooks:

rm .git/hooks/pre-commit .git/hooks/post-merge

Your backed-up hooks (if any) are in .git/hooks/*.backup-*.

  • See bd-51 for the race condition bug report
  • See AGENTS.md for the full git workflow
  • See examples/ for other integrations