v0.41.0
boratanrikulu/gecitv0.41.0May 7, 2026by martinvonz
AI Summary
This release adds line-range formatting for `jj fix`, a global `--no-integrate-operation` flag, and new template functions including `replace()` and `ByteString`.
Key Highlights
- `jj fix` now supports formatting specific line ranges.
- New global flag `--no-integrate-operation` prevents impacting repo state.
- Added `replace(pattern, content, replacement)` template function and `ByteString` type.
- New `--pattern` flag syntax for file search.
Breaking Changes
- `file search` `--pattern` flag now defaults to `regex:` instead of `glob:`.
- `jj git push` no longer fails for private or conflicting revisions; eligible bookmarks are skipped.
- Branch/bookmark patterns in `jj git clone` are now saved to the repo settings file instead of `.git/config`.
New Features
- Line-range formatting for `jj fix`
- Global integration operation flag
- Template function `replace()`
- Template type `ByteString`
- Config option `diff.git.show-path-prefix`
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)