Skip to main content

Stale git fsmonitor daemon on an external volume hangs `git status`

entry

Date: 2026-09-25 Source: live reproduction on Zappo (macbook-pro-3), repo /Volumes/FATTY/src/pool

Symptom​

The daily repo-hygiene-sweep cron (0bed40efa6f0, 19:52) failed with subprocess.TimeoutExpired: git -C /Volumes/FATTY/src/pool status --porcelain after 20s. A plain git status run by hand did not return within 240s. git rev-parse, git ls-files -m, df and ls on the same volume were all instant.

Cause​

core.fsmonitor=true in that repo, with an fsmonitor--daemon process left running since a previous boot (PID 4185, started Sat 06:00, holding /Volumes/FATTY/src/pool/.git/fsmonitor--daemon.ipc). Git client and daemon never complete their handshake, so git status blocks indefinitely. The daemon was started by the Command Line Tools git; a later git command respawned a daemon from /usr/local/opt/git, so two git installs are involved. The volume is healthy APFS (91% used, no I/O errors).

Fix​

  1. git -C /Volumes/FATTY/src/pool config core.fsmonitor false (durable, repo-scoped).
  2. Kill the orphaned daemon.
  3. repo_hygiene_sweep.py now calls every git command with -c core.fsmonitor=false, so a stale daemon on any repo under /Volumes/FATTY/src cannot hang the sweep again.

Verify​

git -C /Volumes/FATTY/src/pool status --porcelain returns in 0.0s with the same 6 modified files; python3 ~/.hermes/scripts/repo_hygiene_sweep.py exits 0 in 7.6s and reports attention: 60 repo(s) dirty/ahead.

Lesson​

When one git command on an external volume hangs while rev-parse, ls-files and df stay instant, suspect the fsmonitor daemon before suspecting the filesystem. Bypass with -c core.fsmonitor=false to confirm in one command, then disable it for that repo.