v0.41.0
SocAIty/SpeechCraftv0.41.0May 7, 2026by martinvonz
AI Summary
An update to the jj version control system focusing on improved formatting capabilities, new template functions, and breaking changes to Git compatibility behaviors.
Key Highlights
- jj fix now supports formatting specific line ranges
- New global --no-integrate-operation flag
- Pattern flag now defaults to regex instead of glob
Breaking Changes
- The --pattern flag for file search now defaults to regex: instead of glob:
- jj git push no longer fails when revisions are private or have conflicts
- Branch/bookmark patterns in jj git clone are saved to repo settings instead of .git/config
New Features
- Line range-limited formatting via jj fix
- replace() template function for content replacement
- ByteString template type
- jj gerrit upload supports --message and --merged options
- New remotes config options for fetch-bookmarks and fetch-tags
- JJ_PAGER can now override ui.pager config
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.41.0/install-and-setup/) to get started. ### Release highlights * `jj fix` now supports formatting specific line ranges (allowing you to format only modified lines); see the configuration manual and notes below for more. * The new global flag `--no-integrate-operation` will let you run a command without impacting the repo state or the working copy, which is useful when automated tools may create snapshots in the background. ### Breaking changes * The `--pattern` flag for `file search` now defaults to `regex:` instead of `glob:`. * `jj git push --all`/`--tracked`/`-r REVSETS` no longer fails when revisions to push are private or have conflicts. Bookmarks which aren't eligible to push will be skipped. * Branch/bookmark patterns passed to `jj git clone` are now saved to jj's repo settings file instead of `.git/config`. Git fetch refspecs are set to the default value. ### Deprecations * In the templating language, the `Operation` type's `.tags()` function has been deprecated in favor of `.attributes()`. ### New features * The `--pattern` flag for `file search` now accepts various pattern kinds through `kind:pattern` syntax. * A new global flag `--no-integrate-operation` lets you run a command without impacting the repo state or the working copy. * A new config option `diff.git.show-path-prefix` can be used to suppress the `a/` and `b/` path prefixes in the `diff --git` output. * `jj fix` now supports line range-limited formatting via the `fix.tools.<name>.line-range-arg` and `run-tool-if-zero-line-ranges` configs. This allows running tools only on modified lines and fine-grained control over when the tool is run. If you have set the `line-range-arg` config, use `--all-lines` to match the previous behavior of formatting the entire file. * A new `replace(pattern, content, replacement)` template function is added which supports replacement of content in templates, using a lambda to format replacement text. It supports all string patterns, including regexes with capture groups (e.g. `replace(regex:'(\w+) (\w+)', "hello world", |c| c.get(1) ++ " " ++ c.get(2))`). * New `ByteString` template type for things like file content. * `jj gerrit upload` now supports the new options `--message` (`-m`), `--edit` and `--merged`. You can now also pass multiple hashtags by repeating the `--hashtag` option. * New `remotes.<name>.fetch-bookmarks`/`fetch-tags` options to [configure default fetch targets.](docs/config.md#default-bookmarks-and-tags-to-fetch) * `JJ_PAGER` can now override the `ui.pager` config, matching `JJ_EDITOR` for callers that need a jj-specific environment override. ### Fixed bugs * Improving consistency with `git` handling of `.gitignore`, including `/` after entries and `\r\r\n` for MacOS files. * `jj status` filters untracked paths by fileset [#9287](https://github.com/jj-vcs/jj/issues/9287) * Improved performance for snapshotting, visibly improving `jj status` speed for large repositories. * Pre-existing Git submodule directories are no longer considered conflicts in checkouts. [#8065](https://github.com/jj-vcs/jj/issues/8065). * Fixed a panic in `jj gerrit upload` when run without `-r` and the inferred revision was immutable. [#9398](https://github.com/jj-vcs/jj/issues/9398) * `jj status` respects path filters in working copy summaries. * `jj git remote rename`/`remove` now updates the `trunk()` alias. * Commands would sometimes incorrectly diagnose a stale working copy and suggest running `jj op integrate` when it would have no effect. This should now be much less likely to happen in practice. [#9314](https://github.com/jj-vcs/jj/issues/9314) ### Contributors Thanks to the people who made this release happen! * Adrian Freund (@freundTech) * ase (@adamse) * Austin Seipp (@thoughtpolice) * Benjamin Tan (@bnjmnt4n) * Björn Kautler (@Vampire) * David Higgs (@higgsd) * David Rieber (@drieber) * dzaima (@dzaima) * Federico G. Schwindt (@fgsch) * Gaëtan Lehmann (@glehmann) * hewigovens (@hewigovens) * Ilya Grigoriev (@ilyagr) * jonmeow (@jonmeow) * Joseph Lou (@josephlou5) * Josh McKinney (@joshka) * Jun Mukai (@jmuk) * Lucas Garron (@lgarron) * Martin von Zweigbergk (@martinvonz) * Matt Stark (@matts1) * Maximilian Gaß (@mxey) * OlshaMB (@OlshaMB) * Philip Metzger (@PhilipMetzger) * rayaq * Remo Senekowitsch (@senekor) * rishiad (@rishiad) * Ryan Patterson (@CGamesPlay) * Sebastian Barfurth (@sbarfurth) * Thomas Axelsson (@thomasa88) * xtqqczze (@xtqqczze) * Yuya Nishihara (@yuja)