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 through
kind: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 the
a/andb/path prefixes in thediff --gitoutput. -
jj fixnow supports line range-limited formatting via thefix.tools.<name>.line-range-arg
andrun-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-arg
config, 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),--edit
and--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 status
speed 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
runningjj 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)