v0.26.0
About
jj is a Git-compatible version control system that is both simple and powerful. See the installation instructions to get started.
Release highlights
-
Improved Git push/fetch compatibility by spawning an external
gitprocess.
This can be enabled by thegit.subprocess=trueconfig knob, and will be the
default in a future release. -
jj logcan now show cryptographic commit signatures. The output can be
controlled by theui.show-cryptographic-signatures=trueconfig knob.
Breaking changes
-
jj abandonnow deletes bookmarks pointing to the revisions to be abandoned.
Use--retain-bookmarksto move bookmarks backwards. If deleted bookmarks
were tracking remote bookmarks, the associated bookmarks (or branches) will be
deleted from the remote onjj git push --all.
#3505 -
jj init --gitandjj init --git-repohave been removed. They were
deprecated in early 2024. Usejj git initinstead. -
The following deprecated commands have been removed:
jj catis replaced byjj file show.jj chmodis replaced byjj file chmod.jj filesis replaced byjj file list.
-
The deprecated
-lshort alias for--limitinjj log,jj op log
andjj obsloghas been removed. The-nshort alias can be used instead. -
The deprecated
--siblingsoptions forjj splithas been removed.
jj split --parallelcan be used instead. -
The deprecated
fix.tool-commandconfig option has been removed. -
In colocated repos, the Git index now contains the changes from all parents
of the working copy instead of just the first parent (HEAD). 2-sided
conflicts from the merged parents are now added to the Git index as conflicts
as well. -
The following change introduced in 0.25.0 is reverted:
jj config listnow prints inline tables{ key = value, .. }literally.
Inner items of inline tables are no longer merged across configuration
files.
-
jj resolvewill now attempt to resolve all conflicted files instead of
resolving the first conflicted file. To resolve a single file, pass a file
path tojj resolve. -
jj util mangenis replaced withjj util install-man-pages, which can
install man pages for alljjsubcommands to a given path. -
In
jj config listtemplate,valueis now typed asConfigValue, not as
Stringserialized in TOML syntax. -
jj git remote add/set-urlnow converts relative Git remote path to
absolute path. -
jj log/op lognow applies-n/--limitbefore the items are reversed.
Rationale: It's more useful to see the N most recent commits/operations, and
is more performant. The old behavior can be achieved byjj log .. | head.
#5403 -
Upgraded
scm-recordfrom v0.4.0 to v0.5.0. See release notes at
https://github.com/arxanas/scm-record/releases/tag/v0.5.0. -
The builtin pager is switched to
streampager. It can handle large
inputs better and can be configured. -
Conflicts materialized in the working copy before
jj 0.19.0may no longer
be parsed correctly. If you are using version 0.18.0 or earlier, check out a
non-conflicted commit before upgrading to prevent issues.
Deprecations
New features
-
jj git {push,clone,fetch}can now spawn an externalgitsubprocess, via
thegit.subprocess = trueconfig knob. This provides an alternative that,
when turned on, fixes SSH bugs when interacting with Git remotes due to
libgit2s limitations #4979. -
jj describenow accepts--edit. -
jj evologandjj op lognow accept--reversed. -
jj restorenow supports-i/--interactiveselection. -
jj file listnow supports templating. -
There is a new
builtin_op_log_onelinetemplate alias you can pass tojj op log -Tfor a more compact output. You can useformat_operation_onelineand
format_snapshot_operation_onelineto customize parts of it. -
New template function
config(name)to access to configuration variable from
template. -
New template function
pad_centered()to center content within a minimum
width. -
Templater now supports
list.filter(|x| ..)method. -
The
diffcommit template keyword now supports custom formatting via
diff.files(). For example,diff.files().map(|e| e.path().display())prints
changed file paths. -
The
diff.stat()template method now provides methods to get summary values. -
jj logcan now show cryptographic commit signatures. The output can be
controlled by theui.show-cryptographic-signatures=trueconfig knob. The
signature template can be customized using
format_detailed_cryptographic_signature(signature)and
format_short_cryptographic_signature(signature). -
New
git.sign-on-pushconfig option to automatically sign commits which are
being pushed to a Git remote. -
New
git.push-new-bookmarksconfig option to push new bookmarks without
--allow-new. -
jj statusnow shows untracked files when they reside directly under a
tracked directory. There's still an issue that files under untracked
directories aren't listed. #5389 -
New
merge-tools.<TOOL>.diff-expected-exit-codesconfig option to suppress
warnings from tools exiting with non-zero exit codes. -
New
fix.tools.TOOL.enabledconfig option to enable/disable tools. This is
useful for defining disabled tools in user configuration that can be enabled
in individual repositories with one config setting. -
Added
--intoflag tojj restore, similarly tojj squashandjj absorb. It is equivalent to--to, but--intois the recommended name. -
Italic text is now supported. You can set e.g.
color.error = { fg = "red", italic = true }in your config. -
New
author_name/author_email/committer_name/committer_email(pattern)
revset functions to match either name or email field explicitly. -
New
subject(pattern)revset function that matches first line of commit
descriptions. -
Conditional configuration now supports
--when.commandsto change
configuration based on subcommand. -
The Jujutsu documentation site now publishes a schema for the official
configuration file, which can be integrated into your editor for autocomplete,
inline errors, and more.
Please see the documentation for more
on this.
Fixed bugs
-
jj git fetchwith multiple remotes will now fetch from all remotes before
importing refs into the jj repo. This fixes a race condition where the
treatment of a commit that is found in multiple fetch remotes depended on the
order the remotes were specified. -
Fixed diff selection by external tools with
jj split/commit -i FILESETS.
#5252 -
Conditional configuration now applies when initializing new repository.
#5144 -
[diff.<format>]configuration now applies to.diff().<format>()commit
template methods. -
Conflicts at the end of files which don't end with a newline character are
now materialized in a way that can be parsed correctly.
#3968 -
Bookmark and remote names written by
jj git cloneto
revset-aliases.'trunk()'are now escaped if necessary.
#5359
Contributors
Thanks to the people who made this release happen!
- Angel Ezquerra (@AngelEzquerra)
- Antoine Martin (@alarsyo)
- Anton Bulakh (@necauqua)
- Austin Seipp (@thoughtpolice)
- Baltasar Dinis (@bsdinis)
- Benjamin Tan (@bnjmnt4n)
- blinry (@blinry)
- Bryce Berger (@bryceberger)
- Charlie-83 (@Charlie-83)
- Christian Stoitner (@cstoitner)
- Evan Martin (@evmar)
- George Christou (@gechr)
- Ilya Grigoriev (@ilyagr)
- Jakob Hellermann (@jakobhellermann)
- JDSeiler (@JDSeiler)
- Jonathan Frere (@MrJohz)
- Jonathan Gilchrist (@jgilchrist)
- Josh Steadmon (@steadmon)
- Martin von Zweigbergk (@martinvonz)
- Matt Kulukundis (@fowles)
- Ollivier Robert (@keltia)
- Philip Metzger (@PhilipMetzger)
- Philipp Albrecht (@pylbrecht)
- Robert Jackson (@rwjblue)
- Samuel Tardieu (@samueltardieu)
- Scott Taylor (@scott2000)
- Stephen Jennings (@jennings)
- Valentin Gatien-Baron (@v-gb)
- Vincent Ging Ho Yim (@cenviity)
- Waleed Khan (@arxanas)
- Yuya Nishihara (@yuja)