v0.33.0
jj-vcs/jjv0.33.0Sep 4, 2025by thoughtpolice
AI Summary
Undo operations are now sequential, a new `jj redo` command has been added, and experimental support for indexing changed paths to improve query performance has been introduced.
Key Highlights
- `jj undo` is now sequential and can undo multiple operations progressively
- New `jj redo` command for progressively redoing operations
- Experimental support for indexing changed paths to speed up file queries
Breaking Changes
- `jj evolog` templates now accept `CommitEvolutionEntry` as context type
- `jj op show` now uses `templates.op_show` configuration for its default template
- The deprecated config option `git.auto-local-branch` has been removed
- The deprecated `Signature.username()` template method has been removed
New Features
- The new command `jj redo` can progressively redo operations
- Templates now support `any()` and `all()` methods on lists
- Added experimental support for indexing changed paths via `jj debug index-changed-paths`
- Filesets now support case-insensitive glob patterns with `glob-i:` prefix
- The new configuration option `git.colocate=boolean` controls whether Git repositories are colocated by default
- Added the `jj metaedit` command to modify a revision's metadata
Full Release Notes
### About jj is a Git-compatible version control system that is both simple and powerful. See the [installation instructions](https://jj-vcs.github.io/jj/v0.33.0/install-and-setup/) to get started. ### Release highlights * `jj undo` is now *sequential*: invoking it multiple times in sequence repeatedly undoes actions in the operation log. Previously, `jj undo` would only undo *the most recent* operation in the operation log. As a result, a new `jj redo` command has been added. * Experimental support for improving query performance over filesets and file queries (like `jj log path/to/file.txt`) has been added. This is not enabled by default. To enable this, you must use the `jj debug index-changed-paths` command. ### Breaking changes * `jj evolog` templates now accept `CommitEvolutionEntry` as context type. To get `Commit` properties, use `commit.<method>()`. To customize the default output, set `templates.evolog` instead of `templates.log`. * `jj op show` now uses `templates.op_show` configuration for its default template instead of `templates.op_log`. * The deprecated config option `git.auto-local-branch` has been removed. Use `git.auto-local-bookmark` instead. * The deprecated `Signature.username()` template method has been removed. Use `Signature.email().local()` instead. * The deprecated `--config-toml` flag has been removed. Use `--config=NAME=VALUE` or `--config-file=PATH` instead. * `jj undo` can now undo multiple operations progressively by calling it repeatedly, whereas previously, running `jj undo` twice was previously a no-op (it only undid the last change). * `jj git fetch` will now only fetch the refspec patterns configured on remotes when the `--bookmark` option is omitted. Only simple refspec patterns are currently supported, and anything else (like refspecs which rename branches) will be ignored. * The `conflict` label used for coloring log graph nodes was renamed to `conflicted`. ### Deprecations * The on-disk index format has changed. `jj` will write index files in both old and new formats, so old `jj` versions should be able to read these index files. This compatibility layer will be removed in a future release. * `jj op undo` is deprecated in favor of `jj op revert`. (`jj undo` is still available, but with new semantics. See also the breaking changes above.) * The argument `<operation>` of `jj undo` is deprecated in favor of `jj op revert <operation>`. * The `--what` flag on `jj undo` is deprecated. Consider using `jj op restore --what` instead. ### New features * The new command `jj redo` can progressively redo operations that were previously undone by multiple calls to `jj undo`. * Templates now support `any()` and `all()` methods on lists to check whether any or all elements satisfy a predicate. Example: `parents.any(|c| c.mine())` returns true if any parent commit is authored by the user. * Add experimental support for indexing changed paths, which will speed up `jj log PATH` query, `jj file annotate`, etc. The changed-path index can be enabled by `jj debug index-changed-paths` command. Indexing may take tens of minutes depending on the number of merge commits. The indexing command UI is subject to change. [#4674](https://github.com/jj-vcs/jj/issues/4674) * `jj config list` now supports `-T'json(self) ++ "\n"'` serialization output. * `jj file show` now accepts `-T`/`--template` option to insert file metadata. * The template language now allows arbitrary whitespace between any operators. * The new configuration option `git.colocate=boolean` controls whether or not Git repositories are colocated by default. * Both `jj git clone` and `jj git init` now take a `--no-colocate` flag to disable colocation (in case `git.colocate` is set to `true`.) * `jj git remote add` and `jj git clone` now support `--fetch-tags` to control when tags are fetched for all subsequent fetches. * `jj git fetch` now supports `--tracked` to fetch only tracked bookmarks. * `jj diff --stat` now shows the change in size to binary files. * `jj interdiff`, `jj evolog -p`, and `jj op log -p` now show diff of commit descriptions. * `jj log` and `jj op log` output can now be anonymized with the `builtin_log_redacted` and `builtin_op_log_redacted` templates. * `jj git init` now checks for an `upstream` remote in addition to `origin` when setting the repository-level `trunk()` alias. The `upstream` remote takes precedence over `origin` if both exist. * Add the `jj metaedit` command, which modifies a revision's metadata. This can be used to generate a new change-id, which may help resolve some divergences. It also has options to modify author name, email and timestamp, as well as to modify committer timestamp. * Filesets now support case-insensitive glob patterns with the `glob-i:`, `cwd-glob-i:`, and `root-glob-i:` pattern kinds. For example, `glob-i:"*.rs"` will match both `file.rs` and `FILE.RS`. * `jj op show` now accepts `-T`/`--template` option to customize the operation output using template expressions, similar to `jj op log`. Also added `--no-op-diff` flag to suppress the operation diff. * A nearly identical string pattern system as revsets is now supported in the template language, and is exposed as `string.match(pattern)`. ### Fixed bugs * `jj git clone` now correctly fetches all tags, unless `--fetch-tags` is explicitly specified, in which case the specified option will apply for both the initial clone and subsequent fetches. * Operation and working-copy state files are now synchronized to disk on save. This will mitigate data corruption on system crash. [#4423](https://github.com/jj-vcs/jj/issues/4423) ### Packaging changes * The test suite no longer optionally uses Taplo CLI or jq, and packagers can remove them as dependencies if present. ### Contributors * Austin Seipp (@thoughtpolice) * Benjamin Tan (@bnjmnt4n) * Christian Hufnagel (@OvidiusCicero) * Clément (@drawbu) * Daniel Luz (@mernen) * Emily (@emilazy) * Evan Martin (@evmar) * Gaëtan Lehmann (@glehmann) * George Christou (@gechr) * Graham Christensen (@grahamc) * Hegui Dai (@Natural-selection1) * Ian Wrzesinski (@isuffix) * Ilya Grigoriev (@ilyagr) * Isaac Corbrey (@icorbrey) * Ivan Petkov (@ipetkov) * Joaquín Triñanes (@JoaquinTrinanes) * Kaiyi Li (@06393993) * Martin von Zweigbergk (@martinvonz) * Nigthknight (@nigthknight) * Nikhil Marathe (@nikhilm) * Remo Senekowitsch (@senekor) * Tijs-B (@Tijs-B) * Yuya Nishihara (@yuja)