Skip to content

gogit v0.10.0 Release Notes

Release Date: 2026-09-08

Overview

This release turns gitscan pending from a single-repo report into a fleet-wide sweep, adds a pushed counterpart command, fixes pending so a never-pushed branch reports its commits instead of erroring, and removes the redundant -d/--dir flag in favor of a uniform positional directory argument. Two breaking changes come with it — the removed flag and a new invariant JSON output shape.

Highlights

Fleet-wide gitscan pending

pending now accepts one or more paths. Each path is either a git repository (reported directly) or a directory whose repositories are discovered (one level deep by default; --depth to go deeper) and each reported in turn. Point it at the GitHub orgs you manage and sweep them in one command:

gitscan pending ~/go/src/github.com/{myorg,myuser}

Repositories are read concurrently, with a live progress bar on stderr (so stdout stays clean for piping and JSON). Repos with nothing pending are omitted from the table/markdown views, and a summary reports how many were scanned, how many have unpushed work, and the total commit count:

Repo: /Users/me/go/src/github.com/myorg/service-a
Pending commits (not yet pushed to @{upstream}): 2

#  HASH     DAY  TIMESTAMP                  MESSAGE
1  1fbde76  Mon  2026-09-07T12:16:02-07:00  feat: add b
2  af0101e  Mon  2026-09-07T12:16:05-07:00  feat: add c

Summary: 42 repos scanned, 2 with unpushed commits, 3 commits total

The output shape is invariant in the number of repositories — a single repo is just a fleet of one — so scripts and agents never have to branch on how many repos matched.

New gitscan pushed command

The counterpart to pending: list the most recent commits already pushed on the current branch — those reachable from its push target (upstream or matching remote-tracking branch) — newest first. Together the two commands show the recent commits on either side of what has reached the remote.

gitscan pushed        # last 10 pushed commits in the current repo
gitscan pushed 25     # last 25

count defaults to 10 and is an optional positional (in either order relative to the directory). The library gains Repo.PushedCommits(ctx, limit) and a LogOptions.Rev field for logging from an arbitrary revision.

pending no longer errors without an upstream

Previously pending errored no upstream configured whenever @{upstream} didn't resolve, which also blocked repos that simply had not been pushed yet — exactly the commits pending should surface. It now resolves a push baseline (the configured upstream, or failing that the matching remote-tracking branch such as origin/main) and, when a branch has never been pushed, reports every commit as pending. An unborn or detached HEAD yields no pending commits rather than an error.

Uniform positional directory

The -d/--dir flag is gone. Every subcommand takes the directory as an optional positional argument defaulting to the current directory, matching how pending already worked.

Breaking Changes

  • -d/--dir removed from gitscan and gitscan order. Pass the directory as a positional argument instead:
gitscan ~/go/src/github.com/myorg        # was: gitscan -d ~/go/src/github.com/myorg
gitscan order ~/go/src/github.com/myorg  # was: gitscan order -d ...
  • pending/pushed JSON shape changed from a single {repo, mode, ref, count, commits} object to an invariant envelope:
{ "repos": [ { "repo": "…", "mode": "unpushed", "ref": "@{upstream}", "count": 2, "commits": [  ] } ],
  "summary": { "reposScanned": 42, "reposWithCommits": 2, "commitsTotal": 3 } }

Consumers should read .repos[] (always an array, even for one repository) and .summary.

Installation

go install github.com/grokify/gogit/cmd/gitscan@v0.10.0

See CHANGELOG.md for the categorized commit list.