- jj fix now supports formatting specific line ranges via line-range-arg and run-tool-if-zero-line-ranges configs
- New global flag --no-integrate-operation to run commands without impacting repo state or working copy
- The --pattern flag for file search now accepts various pattern kinds through kind:pattern syntax
- New config option diff.git.show-path-prefix to suppress a/ and b/ path prefixes in diff --git output
- New replace(pattern, content, replacement) template function supporting pattern replacement with lambda formatting
- New ByteString template type for things like file content
- jj gerrit upload now supports --message, --edit, --merged options and multiple --hashtag repetitions
- New remotes.<name>.fetch-bookmarks and fetch-tags options to configure default fetch targets
- JJ_PAGER environment variable can now override ui.pager config
- 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 are private or have conflicts
- Branch/bookmark patterns passed to jj git clone are now saved to jj repo settings file instead of .git/config
- Improved consistency with git handling of .gitignore including / after entries and \r\r\n for macOS files
- jj status now filters untracked paths by fileset
- Improved performance for snapshotting, visibly improving jj status speed for large repositories
- Pre-existing Git submodule directories are no longer considered conflicts in checkouts
- Fixed a panic in jj gerrit upload when run without -r and the inferred revision was immutable
- jj status now respects path filters in working copy summaries
- jj git remote rename/remove now updates the trunk() alias
- Commands no longer incorrectly diagnose a stale working copy and suggest running jj op integrate when it would have no effect
- In the templating language, Operation type's .tags() function has been deprecated in favor of .attributes()
About
jj is a Git-compatible version control system that is both simple and powerful. See the installation instructions to get started.
Release highlights
-
jj fixnow 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-operationwill 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
--patternflag forfile searchnow defaults toregex:instead ofglob:. -
jj git push --all/--tracked/-r REVSETSno 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 cloneare 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
Operationtype's.tags()function has been deprecated in favor of.attributes().
New features
-
The
--patternflag forfile searchnow accepts various pattern kinds throughkind:patternsyntax. -
A new global flag
--no-integrate-operationlets you run a command without impacting the repo state or the working copy. -
A new config option
diff.git.show-path-prefixcan be used to suppress thea/andb/path prefixes in thediff --gitoutput. -
jj fixnow supports line range-limited formatting via thefix.tools.<name>.line-range-argandrun-tool-if-zero-line-rangesconfigs. This allows running tools only on modified lines and fine-grained control over when the tool is run. If you have set theline-range-argconfig, use--all-linesto 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
ByteStringtemplate type for things like file content. -
jj gerrit uploadnow supports the new options--message(-m),--editand--merged. You can now also pass multiple hashtags by repeating the--hashtagoption. -
New
remotes.<name>.fetch-bookmarks/fetch-tagsoptions to configure default fetch targets. -
JJ_PAGERcan now override theui.pagerconfig, matchingJJ_EDITORfor callers that need a jj-specific environment override.
Fixed bugs
-
Improving consistency with
githandling of.gitignore, including/after entries and\r\r\nfor MacOS files. -
jj statusfilters untracked paths by fileset #9287 -
Improved performance for snapshotting, visibly improving
jj statusspeed for large repositories. -
Pre-existing Git submodule directories are no longer considered conflicts in checkouts. #8065.
-
Fixed a panic in
jj gerrit uploadwhen run without-rand the inferred revision was immutable. #9398 -
jj statusrespects path filters in working copy summaries. -
jj git remote rename/removenow updates thetrunk()alias. -
Commands would sometimes incorrectly diagnose a stale working copy and suggest running
jj op integratewhen it would have no effect. This should now be much less likely to happen in practice. #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)