Skip to main content
Version: 1.9

The commit command

Use dispat commit -m to write a source commit with a checked CCME message. Use dispat commit without authoring flags to run the existing per-package release step.

To check a string without staging files or creating a commit, use dispat diagnostics.

Write a source commit

Stage the files you intend to commit, then pass a message:

git add packages/core/api.go
dispat commit -m "feat(core): add streaming"

dispat uses the repository's parser settings to check the message before Git creates the commit. An error in any unit rejects the whole message. Warnings are shown but do not block creation unless an existing parser option makes them errors. This check validates syntax; use dispat status afterwards to inspect scopes, versions, and the release plan.

A message can also come from a file or Git's editor:

dispat commit --file message.txt
dispat commit --edit
dispat commit --amend -m "fix(core): close the stream"

-C/--reuse-message and -c/--reedit-message can reuse a named commit's message; the latter opens the editor before validation.

Authoring mode uses Git's commit operation. It does not run package release scripts, select releasing packages, create release tags, or push. Git controls staging, identity, signing, and hooks. As with git commit --amend, an explicit amend request replaces the current commit. Review your index before running it.

dispat validates after an existing commit-msg hook has run and after applying the selected cleanup policy. --no-verify and -n are refused because they would skip this check. Calling Git directly still bypasses dispat, so keep required history validation in CI.

Use full long-option names. Supported Git options cover message sources, editing and amending, identity and signing, staging and pathspecs, trailers, cleanup, and dry-run output. Unknown options and abbreviated long options are refused before Git runs. A dry run displays Git's proposed changes but does not validate or create a commit.

For comment cleanup, set an explicit core.commentChar; auto is not supported by the validation wrapper. The raw message file is limited to 16 MiB, and the parser's configured message limit applies to the cleaned text. Temporary hook wrappers and parser settings are removed when the command finishes. Existing hooks remain repository-trusted executable code.

Do not combine authoring flags with release-step flags such as --tag, --push, --package, or --message-format. Put dispat's global options before commit to distinguish them from Git options:

dispat --config dispat.yaml commit -m "fix(core): close the stream"

Create release commits

Run dispat commit to create a release commit for each covered package. dispat stages the package folder along with any commit.include paths, then writes a commit message using commit.messageFormat to insert the package's name and tag.

If a package has nothing to stage, dispat cleanly skips it.

Pass --tag to create an annotated release tag at the new commit. dispat skips the tag and logs W223 if it already exists at that exact commit, but fails if the tag points anywhere else.

Add --push to push the branch to your remote once all packages finish. If you also pass --tag, dispat pushes the tags with force, so a tag the remote already carries is replaced rather than left as it is. Pass --no-force to skip those tags instead; see commit.force.

Run this command inside a release stage script to access the DISPAT_OUTPUT environment variable. dispat exports each package's commit as PACKAGE_<KEY>, pinning the outer run's tag and GitHub release to it.

dispat processes packages one at a time. A repository only has one index and one HEAD, and a sequential release order makes the history easier to read.

The selection it shares

The dispat changelog, dispat autoversion, dispat commit, and dispat github commands expose native release pipeline steps to your custom flows. Run a step inside a stage script exactly when your flow needs it. When the release stage runs later, it sees the completed work and skips it.

All four commands share the run command's selection and its release window. Run them without flags to cover every releasing package in dependency order. Use --package, --space, --group, or your current folder to narrow that list.

Pass --since to replace the time window entirely. Use --consumers to expand the selection downstream, and --on-error to decide what happens to dependent packages if one fails.

Selection follows two rules. If a term matches no package, the command fails. If a selected package is not releasing, dispat logs a no-op.

This ensures your flow never fails over a converged or held package. This second rule explains why a step run after dispat commit --tag covers nothing. You must pass --since all to put the tagged package back into the selection.

These four command words are reserved. Like all built-in commands, they win the dispat <script> shorthand over a custom script with the same name. This means dispat commit always triggers the native command.

Type dispat run commit to run your custom script instead.

Every config value these commands use is also available as a flag. Pass the flag to override the config for a single run, as shown in Flags.

Flags

These flags apply alongside the global flags:

--package, -p

Pass this to narrow every package-selecting command (release, status, run, preview, changelog, autoversion, autowriter, autoreplacer, commit, github, compute) to the named packages. You can repeat the flag or separate names with commas. dispat matches names case-insensitively and supports * globs, so -p '*' selects every package. See Choosing the packages.

--space, -s

Pass this to narrow the same eleven commands to every package in the named spaces. This flag uses the same spelling rules as --package. Standalone packages belong to no space. See Choosing the packages.

--group, -g

Pass this to narrow the same eleven commands to every package in the named versioning groups. This flag uses the same spelling rules. A group is a versionGroups entry or a space that versions as one, meaning it can cross spaces. See Choosing the packages.

--since

Pass this to the same seven commands to cover packages modified by commits since a specific git revision. This overrides the release window. Pass all to cover every package. See the run command.

--consumers

Pass this to the same seven commands to also cover every package that transitively depends on a selected one. See the run command.

--on-error

The default is skip. Pass skip or continue to every sweeping command (run, autowriter, autoreplacer, changelog, autoversion, commit, github) to decide what a failed package does to its dependents. The skip option is transitive. The command exits 1 on any failure regardless of this setting.

--tag

Pass this to commit to create an annotated release tag at the resulting commit. dispat skips an identical existing tag. If a tag exists at a different commit, dispat leaves it alone and reports E221.

--push

Pass this to commit to push the branch. If you also pass --tag, dispat pushes the tags too.

--no-force

Pass this to commit to turn commit.force off for this run. dispat leaves any tag the repository or remote already carries exactly as it is.

--name, --email

The default comes from config. Pass these to commit to override the commit.name and commit.email committer identity.

--remote

The default comes from config. Pass this to commit to override the commit.remote push target.

--tag-name

The default is computed by dispat. Pass this to commit to name the annotated tag yourself instead of letting dispat compute it. You can pass $DISPAT_TAG from a release stage. This works for one package only.

--message-format

The default comes from config. Pass this to commit to override the commit.messageFormat template.

--include

The default comes from config. Pass this to commit to override the commit.include extra staged paths.