gogit v0.15.0 Release Notes
Release Date: 2026-10-11
Overview
This release answers one question that gitscan pending could not: are the
commits I am about to push signed? Each pending commit now shows whether it
carries a signature, and a warning gives the unsigned count when several
commits are pending. The same logic is available from Go, and the report
building and rendering behind pending and pushed moved into a public
report package so library and MCP callers share it with the CLI. No
breaking changes to the Go API.
Highlights
See unsigned commits before they reach GitHub
gitscan pending .
Pending commits (not yet pushed to @{upstream}): 3
# HASH SIGNED DAY TIMESTAMP MESSAGE
1 a1b2c3d yes Thu 2026-10-08T09:12:04-07:00 feat: add invoice export
2 d4e5f6a NO Thu 2026-10-08T09:40:31-07:00 fix: round tax to cents
3 0f9e8d7 yes Thu 2026-10-08T10:02:55-07:00 docs: describe the export format
WARNING: 1 of 3 commits are not signed.
The warning appears when more than one commit is listed and some are
unsigned. gitscan pushed has the same column and warning. In JSON each
commit gains signed and each repository an unsigned count; in markdown the
table gains a Signed column. See the
guide.
Signing is detected from the commit's signature header, not from git's %G?
status. With SSH signing and no gpg.ssh.allowedSignersFile, %G? reports
"no signature" for commits that are signed, which would have flagged every
commit. The trade-off is that the check is presence, not validity: a commit
signed with a key GitHub does not know still reads yes here and shows as
Unverified there.
Signature state in the library
res, _ := repo.PendingCommits(ctx, "")
fmt.Println(res.UnsignedWarning()) // "1 of 3 commits are not signed", or ""
LogOptions.IncludeSignatureandCommit.Signed(*bool, nil when not collected);PendingCommitsandPushedCommitsalways collect it.Commit.IsUnsigned,Commit.HasSignature,CountUnsigned,HasSignatureInfo, andSignatureWarning, so callers do not re-implement the policy.PendingResult.UnsignedCountandPendingResult.UnsignedWarning.
A public report package
github.com/grokify/gogit/report holds what the CLI used to do privately:
report.Pendingandreport.Pushedrun a query and buildReports, applying the timezone and the pending mode. A repository that cannot be read becomes aReportwithErrset instead of failing the sweep.report.BuildEnvelopereturns the JSON structure (Envelope,RepoEntry,Row,Summary), ready for an MCP tool to return as is.report.Writerenders table, markdown, or JSON.
The cmd package now only parses arguments, drives the progress bar and
prints.
Changed
- The
pendingandpushedtable and markdown output gain a SIGNED column after HASH. Scripts that parse the table by column position should use--format json, which only gains fields. PendingCommitsandPushedCommitsrun one extragit logover the same range to read signature state. It reads commit objects only and does not invoke gpg or ssh.gitscan pushednow validates--tzbefore running git.
Documentation
- New guide: Catch Unsigned Commits Before You Push.
AGENTS.mdlists thereportpackage and where policy decisions belong.
Upgrade Notes
Additive for Go callers: Commit gains Signed, LogOptions gains
IncludeSignature, and report is new. Commit.Signed is nil from any query
that does not set IncludeSignature, so existing code sees no change. The
renderer previously in internal/render was not importable, so nothing
outside the module depended on it.
Installation
go get github.com/grokify/gogit@v0.15.0
go install github.com/grokify/gogit/cmd/gitscan@v0.15.0
See CHANGELOG.md for the categorized commit list.