v0.41.0

d2lang/d2v0.41.0May 7, 2026by martinvonz

AI Summary

Enhanced the jj fix command with line-range formatting capabilities and introduced a global flag to run commands without impacting repo state.

Key Highlights

  • jj fix now supports formatting specific line ranges
  • New global flag --no-integrate-operation
  • File search --pattern flag now defaults to regex
  • Git push behavior improved to handle private/conflicts

Breaking Changes

  • The --pattern flag for file search now defaults to regex instead of glob
  • 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

  • File search --pattern accepts various pattern kinds through kind:pattern syntax
  • New global flag --no-integrate-operation
  • New config option diff.git.show-path-prefix
  • New replace(pattern, content, replacement) template function
  • New ByteString template type
  • jj gerrit upload supports --message, --edit, and --merged options
  • New remotes.<name>.fetch-bookmarks and fetch-tags options
  • JJ_PAGER can now override the 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)