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)