Skip to content

Releases: asatamax/git-fleet

v1.3.1

Choose a tag to compare

@asatamax asatamax released this 15 Oct 10:53

What's Changed

Fix: --json output could be invalid or crash

JSON was printed through Rich, which wrapped long values at the terminal width (80 columns when piped) and read [...] in paths or branch names as markup. Depending on the data, commands produced invalid JSON or exited with an error.

  • Every --json document is now written to stdout as exact JSON through one shared path, regardless of terminal width or the characters in paths and branch names.
  • In JSON mode, error and warning messages go to stderr, so stdout contains only the JSON document. Exit codes are unchanged.
  • list --json --paths now returns JSON; --json takes precedence over --paths.
  • JSON shape and keys are unchanged.

Faster repository discovery

Discovery no longer descends into .git directories or node_modules, which roughly halves discovery time on large trees. The set of discovered repositories is otherwise unchanged; repositories located inside node_modules are no longer listed.

Fix: --dry-run reported actions that did not happen

sync --dry-run printed Pulled 1/1 / Pushed 1/1 although nothing was pulled or pushed. Dry runs of pull, push and sync now say what would happen (Would pull, Would push, Pull Preview (dry-run)). Output without --dry-run is unchanged.

v1.3.0

Choose a tag to compare

@asatamax asatamax released this 15 Oct 10:06

What's Changed

New worktrees command

A read-only inventory of linked worktrees across the fleet, to find repositories where stale worktrees have piled up.

git-fleet worktrees              # per-repository summary
git-fleet worktrees PATH --detail   # one row per worktree
git-fleet worktrees --fetch      # fetch with --prune first, so "gone" is current
git-fleet worktrees --json       # unfiltered inventory for scripts and agents

Each linked worktree is classified by its branch's upstream state:

State Meaning
gone Upstream configured but deleted on the remote (typically a merged PR)
alive Upstream exists
none No upstream configured
detached Detached HEAD
missing Worktree directory no longer exists (prunable)

Lock state, uncommitted changes, last commit date, and whether the worktree lives outside the repository are also reported.

  • The summary table lists only repositories that have linked worktrees, and marks a repository with ⚠ when any of its worktrees is on a gone branch.
  • --detail lists worktrees newest first and points out clean gone worktrees as cleanup candidates.
  • The command never modifies repositories: status checks run with --no-optional-locks, so worktree indexes are not rewritten. A worktree whose status cannot be read is shown as error, never as clean.
  • Deleting worktrees is intentionally out of scope.

Requires Git 2.36 or later (git worktree list --porcelain -z).

v1.2.0

Choose a tag to compare

@asatamax asatamax released this 15 Oct 06:54

What's Changed

New --off-default / -o filter for status and sync

Shows only repositories whose HEAD is on a branch other than the default branch. Repositories left on a feature branch keep pulling that branch and silently fall behind the default branch; this filter makes them visible.

When combined with --dirty, the two conditions are OR-combined:

# Repos needing attention OR left on a non-default branch
git-fleet status -d -o
git-fleet sync -d -o

Like --dirty, this is a display filter for the table and is ignored with --json. JSON output now includes default_branch and off_default_branch for each repository instead.

Fix: default branch names containing slashes

origin/HEAD pointing at a branch such as agent/claude-code was resolved as claude-code. The full branch name is now kept.

v1.1.0

Choose a tag to compare

@asatamax asatamax released this 19 Jul 05:08

What's Changed

Explicit path argument now overrides configured roots file

Previously, when a roots file auto-resolved (via $GIT_FLEET_ROOTS, ~/.config/git-fleet/roots, or ~/.git-fleet-roots), an explicit PATH argument was silently ignored and multi-root mode ran instead — contradicting the README examples.

Now every command resolves its target in this order:

  1. --roots FILE given explicitly → multi-root mode using that file
  2. PATH argument given explicitly → single-root ad-hoc scan of that path (auto-resolution skipped entirely)
  3. Auto-resolved roots file → multi-root mode
  4. Otherwise → single-root scan of the current directory
# Even with a roots file configured, an explicit path scans only that tree
git-fleet status ~/Development/oss

# Ad-hoc scan of the current directory
git-fleet status .

Passing PATH together with --roots is now an error (exit code 1).

Applies uniformly to all 9 commands (status, diff, fetch, pull, push, sync, list, who, remote). The MCP tool schema (--schema) documents the new precedence in a resolutionPrecedence block.

Full Changelog: v1.0.9...v1.1.0

v1.0.9

Choose a tag to compare

@asatamax asatamax released this 28 May 04:54

Full Changelog: v1.0.8...v1.0.9

v1.0.8

Choose a tag to compare

@asatamax asatamax released this 19 May 09:40

Highlights

--dirty filter for status / sync

A new --dirty / -d flag hides repositories that are both clean and in sync from the rendered status table, so you can focus on repos that need attention.

  • Display-only filter: data layer is unchanged, only the human-facing Rich table is filtered.
  • --json output is intentionally not affected — machine consumers always receive the full repository list.
  • Summary line reports the hidden count, e.g. Total: 52 | (44 hidden by --dirty).
git-fleet status --dirty
git-fleet sync --dirty

Bullet list of synced repositories

The sync command now lists the repositories that were actually pulled or pushed beneath the count lines, in dim color:

Step 2/4: Pulling repositories (smart)...
  Pulled 2/2 repositories
    • nvim
    • git-fleet

Failures and warnings remain on their existing colored lines and are not duplicated in the bullet list.

Full changelog

  • feat: add --dirty filter to status and sync commands
  • feat: list synced repositories under sync step counts
  • chore: bump version to 1.0.8

v1.0.7

Choose a tag to compare

@asatamax asatamax released this 25 Mar 03:39

Bug Fixes

  • Fix status command ValueError: Resolve too many values to unpack error that broke all repository display in status command (fetch_all() returns 3-tuple but only 2 were unpacked). sync was unaffected as it fetches separately.

Improvements

  • Unify progress display across commands: Split status command's single "Fetching and analyzing..." progress bar into separate "Fetching..." and "Analyzing..." steps with fetch result summary (success count, errors, warnings), matching sync command's display pattern. Applied to both single-root and multi-root modes.

v1.0.6

Choose a tag to compare

@asatamax asatamax released this 16 Mar 02:57

What's New

Auto-recovery from case-insensitive filesystem ref conflicts

On macOS and Windows (case-insensitive filesystems), when a remote has branches that differ only in case (e.g. Feat/UXUI-257 vs feat/UXUI-257), git fetch and git pull fail with errors like:

error: You're on a case-insensitive filesystem, and the remote you are
trying to fetch from has references that only differ in casing.

git-fleet now automatically recovers from this common issue:

  • fetch: Detects the case-insensitive conflict and treats it as a successful fetch with a warning (the target branch data is actually fetched correctly)
  • pull: Falls back to git merge origin/<branch> when git pull fails due to this issue
  • sync: Both fetch and pull steps handle recovery transparently

Warning display

Recovered operations are shown with a yellow ⚠ icon in table output and include a warning field in JSON output:

{
  "success": true,
  "warning": "Case-insensitive ref conflict (partial fetch succeeded)"
}

Summary includes a warned count when applicable.

Files Changed

  • core.py: Recovery logic in GitOperations.fetch_all() and GitOperations.pull(), new _pull_via_merge() fallback, warning field in OperationResult
  • formatters.py: Yellow ⚠ icon for warned results in both single-root and multi-root output
  • schema.py: Updated fetch/pull descriptions and notes

v1.0.5

Choose a tag to compare

@asatamax asatamax released this 06 Mar 05:26

What's Changed

Progress bars for long-running operations

Replaced indeterminate spinners with real-time progress bars showing count and percentage for all long-running operations:

Fetching and analyzing... ━━━━━━━━━━━━━━━━━━━━ 35/47  74%

Commands with progress bars: status, fetch, who, diff, remote, sync (fetch/status steps)

Full Changelog: v1.0.4...v1.0.5

v1.0.4

Choose a tag to compare

@asatamax asatamax released this 03 Mar 08:38

Improvement

Show error details for failed operations in sync command.

Previously, git-fleet sync only displayed summary counts like Pulled 0/1 repositories when operations failed, with no indication of why they failed. Now, failed repositories and their error messages are printed inline:

Step 2/4: Pulling repositories (smart)...
  Pulled 0/1 repositories
    ✗ matsuya-pwa: error: fetching ref refs/remotes/origin/... failed: incorrect old value provided

This applies to all three steps (fetch, pull, push) in both single-root and multi-root sync modes. Standalone pull/push commands already showed error details via their results table — this brings sync to parity.