Releases: jj-vcs/jj
v0.30.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
-
The experimental support from release 0.29.0 for transferring the change ID
to/from Git remotes has been enabled by default. The change ID is stored in
the Git commit itself (in a commit header calledchange-id), which means
it will be transferred by regulargit pushetc. Please let us know if you
run into any problems with it. You can disable it setting
git.write-change-id-header. Note that some Git remotes (e.g GitLab) and
some Git commands (e.g.git rebase) do not preserve the change ids when
they rewrite commits. -
jj rebasenow automatically abandons divergent commits if another commit
with the same change ID is already present in the destination with identical
changes. -
jj splithas gained--message,--insert-before,--insert-after, and
--destinationoptions. -
jj evologcan show associated operations for commits created by new jj
versions.
Breaking changes
-
The old
libgit2code path for fetches and pushes has been removed,
and thegit.subprocesssetting along with it. -
In templates, bookmark/tag/remote names are now formatted in revset symbol
notation. The type ofbookmark.remote()is changed toOption<_>.
bookmark.remote() == "foo"still works, butbookmark.remote().<method>()
might needif(bookmark.remote(), ..)to suppress error. -
jj rebasenow automatically abandons divergent commits if another commit
with the same change ID is already present in the destination with identical
changes. To keep these divergent commits, use the--keep-divergentflag. -
The deprecated
--skip-emptyflag forjj rebasehas been removed. Use the
--skip-emptiedflag instead. -
The deprecated
jj branchsubcommands have been removed. Use thejj bookmarksubcommands instead. -
jj util completionnow requires the name of the shell as a positional
argument and no longer produces Bash completions by default. The deprecated
optional arguments for different shells have been removed. -
(Update: this entry was mistakenly omitted in the release notes previously)
External diff tools are now run in the temporary directory containing
the before (left) and after (right) directories, making diffs appear
more pleasing for tools that display file paths prominently. Users can
opt out of this by settingmerge-tools.<tool>.diff-do-chdir = false,
but this will likely be removed in a future release. Please report any
issues you run into.
Deprecations
-
The
ui.diff.formatandui.diff.toolconfig options have been merged as
ui.diff-formatter. The builtin format can be specified as:<format>
(e.g.ui.diff-formatter=":git"for Git diffs.) -
The
.normal_hex()method will be removed from theCommitIdtemplate type.
It's useful only for theChangeIdtype.
New features
-
jj splithas gained a--messageoption to set the description of the
commit with the selected changes. -
jj splithas gained the ability to place the revision with the selected
changes anywhere in the revision tree with the--insert-before,
--insert-afterand--destinationcommand line flags. -
Added
git.track-default-bookmark-on-clonesetting to control whether to
track the default remote bookmark onjj git clone. -
Templates can now do arithmetic on integers with the
+,-,*,/, and
%infix operators. -
Evolution history is now stored in the operation log.
jj evologcan show
associated operations for commits created by new jj versions.
Fixed bugs
-
Work around a git issue that could cause subprocess operations to hang if the
core.fsmonitorgitconfig is set in the global or system gitconfigs.
#6440 -
jj parallelizecan now parallelize groups of changes that start with an
immutable change, but do not contain any other immutable changes. -
jjwill no longer warn about deprecated paths on macOS if the configured
XDG directory is the deprecated one (~/Library/Application Support). -
The builtin diff editor now correctly handles splitting changes where a file
is replaced by a directory of the same name.
#5189
Packaging changes
- Due to the removal of the
libgit2code path, packagers should remove any
dependencies onlibgit2,libssh2, Zlib, OpenSSL, andpkg-config, and
ensure they are not setting the Cargogit2orvendored-opensslfeatures.
Contributors
Thanks to the people who made this release happen!
- Alper Cugun (@alper)
- Austin Seipp (@thoughtpolice)
- Benjamin Brittain (@benbrittain)
- Benjamin Tan (@bnjmnt4n)
- Bryce Berger (@bryceberger)
- Colin Nelson (@orthros)
- Doug Stephen (@dljsjr)
- Emily (@emilazy)
- Eyvind Bernhardsen (@eyvind)
- Felix Geisendörfer (@felixge)
- Gaëtan Lehmann (@glehmann)
- Ilya Grigoriev (@ilyagr)
- Isaac Corbrey (@icorbrey)
- Jonas Greitemann (@jgreitemann)
- Josep Mengual (@truita)
- kkoang (@kkoang)
- Manuel Mendez (@mmlb)
- Marshall Bowers (@maxdeviant)
- Martin von Zweigbergk (@martinvonz)
- Mateus Auler (@mateusauler)
- Michael Pratt (@prattmic)
- Nicole Patricia Mazzuca (@strega-nil)
- Philip Metzger (@PhilipMetzger)
- Scott Taylor (@scott2000)
- T6 (@tjjfvi)
- Vincent Ging Ho Yim (@cenviity)
- Winter (@winterqt)
- Yuya Nishihara (@yuja)
v0.29.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
- Experimental support for transferring the change ID to/from Git remotes behind configuration
settinggit.write-change-id-header. If this is enabled, the change ID will be stored in the Git
commit itself (in a commit header calledchange-id), which means it will be transferred by
regulargit pushetc. This is an evolving feature that currently defaults to "false". This
default will likely change in the future as we gain confidence with forge support and user
expectations.
Breaking changes
-
jj git push -c/--changeno longer moves existing local bookmarks. -
The
editor-*.jjdescriptionfiles passed to your editor by e.g.jj describe
are now written to your system's temporary directory instead of.jj/repo/.
Deprecations
-
git.subprocess = falsehas been deprecated, and the oldlibgit2
code path for fetches and pushes will be removed entirely in 0.30.
Please report any remaining issues you have with the Git
subprocessing path. -
ui.default-descriptionhas been deprecated, and will be migrated to
template-aliases.default_commit_description. Please also consider using
templates.draft_commit_description,
and/ortemplates.commit_trailers. -
On macOS, config.toml files in
~/Library/Application Support/jjare
deprecated; one should instead use$XDG_CONFIG_HOME/jj
(defaults to~/.config/jj)
New features
-
Color-words diff has gained an option to compare conflict pairs without
materializing. -
jj showpatches can now be suppressed with--no-patch. -
Added
ui.bookmark-list-sort-keyssetting to configure default sort keys for the
jj bookmark listcommand. -
New
signedrevset function to filter for cryptographically signed commits. -
jj describe,jj commit,jj new,jj squashandjj splitadd the
commit trailers, configured in thecommit_trailerstemplate, to the commit
description. Use cases include DCO Sign Off and Gerrit Change Id. -
Added
duplicate_descriptiontemplate, which allows customizing the descriptions
of the commitsjj duplicatecreates. -
jj absorbcan now squash a deleted file if it was added by one of the
destination revisions. -
Added
ui.streampager.show-rulersetting to configure whether the ruler should be
shown when the builtin pager starts up. -
jj git fetchnow warns instead of erroring for unknowngit.fetchremotes
if other remotes are available. -
Commit objects in templates now have
trailers() -> List<Trailer>, the Trailer
objects havekey() -> Stringandvalue() -> String. -
jj config editwill now roll back to previous version if a syntax error has been introduced in the new config. -
When using dynamic command-line completion, revision names will be completed
in more complex expressions. For example, typing
jj log -r first-bookmark..secand then pressing Tab could complete the
expression tofirst-bookmark..second-bookmark.
Fixed bugs
-
Fixed crash on change-delete conflict resolution. #6250
-
The builtin diff editor now tries to preserve unresolved conflicts. #4963
-
Fixed bash and zsh shell completion when completing aliases of multiple arguments. #5377
Packaging changes
- Jujutsu now uses
zlib-rs, a fast compression library written in Rust. Packagers should remove any dependency on CMake and drop thepackagingCargo feature.
Contributors
Thanks to the people who made this release happen!
- Aleksey Kuznetsov (@zummenix)
- Austin Seipp (@thoughtpolice)
- Benjamin Brittain (@benbrittain)
- Benjamin Tan (@bnjmnt4n)
- Caleb White (@calebdw)
- Daniel Luz (@mernen)
- Emily (@emilazy)
- Emily (@neongreen)
- Gaëtan Lehmann (@glehmann)
- George Christou (@gechr)
- Ilya Grigoriev (@ilyagr)
- Jacob Hayes (@JacobHayes)
- Jonas Greitemann (@jgreitemann)
- Josh Steadmon (@steadmon)
- Martin von Zweigbergk (@martinvonz)
- Mateus Auler (@mateusauler)
- Nicole Patricia Mazzuca (@strega-nil)
- Nils Koch (@nilskch)
- Philip Metzger (@PhilipMetzger)
- Remo Senekowitsch (@senekor)
- Sam (@Samasaur1)
- Steve Fink (@hotsphink)
- Théo Daron (@tdaron)
- TimerErTim (@TimerErTim)
- Vincent Ging Ho Yim (@cenviity)
- Winter (@winterqt)
- Yuya Nishihara (@yuja)
v0.28.2
Fixed bugs
- Fixed problem that old commits could be re-imported from Git.
GitoxideLabs/gitoxide#1928
v0.28.1
Note
Also see the v0.28.0 release notes.
About
jj is a Git-compatible version control system that is both simple and powerful. See the installation instructions to get started.
Security fixes
- Fixed SHA-1 collision attacks not being detected.
(GHSA-794x-2rpg-rfgr)
Fixed bugs
-
Resolved some potential build issues for packagers.
#6232 -
Fix a bug with
:oursand:theirsmerge tools involving conflicted trees
with more than two sides. #6227
Contributors
Thanks to the people who made this release happen!
- Emily (@emilazy)
- Ilya Grigoriev (@ilyagr)
- Nicole Patricia Mazzuca (@strega-nil)
- Scott Taylor (@scott2000)
- Yuya Nishihara (@yuja)
v0.28.0
Important
v0.28.0 was yanked from https://crates.io and superseded by v0.28.1.
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's configuration can now be split into multiple files more easily.
-
jj resolvenow accepts built-in tools:oursand:theirs. -
In colocated repos, newly-created files will now appear in
git diff. -
A long-standing bug relating to empty files in the built-in diff editor was
fixed. #3702
Breaking changes
-
The minimum supported Rust version (MSRV) is now 1.84.0.
-
The
git.push-branch-prefixconfig has been removed in favor of
git.push-bookmark-prefix. -
jj abandonno longer supports--summaryto suppress the list of abandoned
commits. The list won't show more than 10 commits to not clutter the console. -
jj unsquashhas been removed in favor ofjj squashand
jj diffedit --restore-descendants. -
The
jj untracksubcommand has been removed in favor ofjj file untrack. -
The following deprecated revset functions have been removed:
branches(),remote_branches(),tracked_remote_branches(), and
untracked_remote_branches(), which were renamed to "bookmarks".file()andconflict(), which were renamed to plural forms.files(x, y, ..)with multiple patterns. Usefiles(x|y|..)instead.
-
The following deprecated template functions have been removed:
branches(),local_branches(), andremote_branches(), which were
renamed to "bookmarks".
-
The flags
--alland--trackedonjj git pushby themself do not cause
deleted bookmarks to be pushed anymore, as an additional safety measure. They
can now be combined with--deletedinstead.
Deprecations
-
core.watchman.register_snapshot_triggerhas been renamed tocore.watchman.register-snapshot-triggerfor consistency with other configuration options. -
jj backoutis deprecated in favor ofjj revert.
New features
-
jj signcan now sign with PKCS#12 certificates through thegpgsmbackend. -
jj signwill automatically use the gpg key associated with the author's email
in the absence of asigning.keyconfiguration. -
Multiple user configs are now supported and are loaded in the following precedence order:
$HOME/.jjconfig.toml$XDG_CONFIG_HOME/jj/config.toml$XDG_CONFIG_HOME/jj/conf.d/*.toml
-
The
JJ_CONFIGenvironment variable can now contain multiple paths separated
by a colon (or semicolon on Windows). -
The command
jj config listnow supports showing the origin of each variable
via thebuiltin_config_list_detailedtemplate. -
jj config {edit,set,unset}now prompt when multiple config files are found. -
jj diff -rnow allows multiple revisions (as long as there are no gaps in
the revset), such asjj diff -r 'mutable()'. -
jj git pushnow accepts a--named NAME=REVISIONargument to create a named
bookmark and immediately push it. -
The 'how to resolve conflicts' hint that is shown when conflicts appear can
be hidden by settinghints.resolving-conflicts = false. -
jj op diffandjj op log --op-diffnow show changes to which commits
correspond to working copies. -
jj op log -dis now an alias forjj op log --op-diff. -
jj bookmark move --to/--fromcan now be abbreviated tojj bookmark move -t/-f -
jj bookmark listnow supports--sortoption. Similar togit branch --sort.
Seejj bookmark list --helpfor more details. -
A new command
jj revertis added, which is similar tojj backoutbut
adds the--destination,--insert-after, and--insert-beforeoptions to
customize the location of reverted commits. -
A new command
jj git rootis added, which prints the location of the Git
directory of a repository using the Git backend. -
In colocated repos, any files that jj considers added in the working copy will
now show up ingit diff(as if you had rungit add --intent-to-addon
them). -
Reversing colors is now supported. For example, to highlight words by
reversing colors rather than underlining, you can set
colors."diff token"={ underline = false, reverse = true }in your config. -
Added
revsets.log-graph-prioritize, which can be used to configure
which branch in thejj loggraph is displayed on the left instead of@
(e.g.coalesce(description("megamerge\n"), trunk())) -
jj resolvenow accepts new built-in merge tools:oursand:theirs.
These merge tools accept side #1 and side #2 of the conflict respectively.
Fixed bugs
-
jj log -p --statnow shows diff stats as well as the default color-words/git
diff output. #5986 -
The built-in diff editor now correctly handles deleted files.
#3702 -
The built-in diff editor now correctly retains the executable bit on newly
added files when splitting. #3846 -
jj config set/--configvalue parsing rule is relaxed in a way that
unquoted apostrophes are allowed.
#5748 -
jj fixcould previously create new conflicts when a descendant of a fixed
revision was already correctly formatted.
Contributors
Thanks to the people who made this release happen!
- Aleksey Kuznetsov (@zummenix)
- Anton Älgmyr (@algmyr)
- Austin Seipp (@thoughtpolice)
- Baltasar Dinis (@bsdinis)
- Benjamin Tan (@bnjmnt4n)
- Brandon Hall (@tenkabuto)
- Caleb White (@calebdw)
- Daniel Luz (@mernen)
- David Rieber (@drieber)
- demize (@demize)
- Emily (@emilazy)
- Evan Mesterhazy (@emesterhazy)
- Fedor Sheremetyev (@sheremetyev)
- George Christou (@gechr)
- Ilya Grigoriev (@ilyagr)
- Jakob Hellermann (@jakobhellermann)
- Jo Liss (@joliss)
- Joachim Desroches (@jedesroches)
- Johannes Altmanninger (@krobelus)
- Jonathan Gilchrist (@jgilchrist)
- Kenyon Ralph (@kenyon)
- Lucas Garron (@lgarron)
- Martin von Zweigbergk (@martinvonz)
- Nick Pupko (@npupko)
- Philip Metzger (@PhilipMetzger)
- Raphael Borun Das Gupta (@das-g)
- Remo Senekowitsch (@senekor)
- Robin Stocker (@robinst)
- Scott Taylor (@scott2000)
- Siva Mahadevan (@svmhdvn)
- Vincent Ging Ho Yim (@cenviity)
- Yuya Nishihara (@yuja)
v0.27.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
git.subprocessis now enabled by default, improving compatibility with Git
fetches and pushes by spawning an externalgitprocess. Users can opt out
of this by settinggit.subprocess = false, but this will likely be removed
in a future release. Please report any issues you run into.
Breaking changes
-
Bookmark name to be created/updated is now parsed as a revset
symbol. Quotation may be needed in addition to shell
quotes. Example:jj bookmark create -r@- "'name with space'" -
jj bookmark create,jj bookmark setandjj bookmark moveonto a hidden
commit make it visible. -
jj bookmark forgetnow untracks any corresponding remote bookmarks instead
of forgetting them, since forgetting a remote bookmark can be unintuitive.
The old behavior is still available with the new--include-remotesflag. -
jj fixnow always sets the working directory of invoked tools to be the
workspace root, instead of the working directory of thejj fix. -
The
ui.allow-filesetsconfiguration option has been removed.
The "fileset" language has been enabled by default since v0.20. -
templates.annotate_commit_summaryis renamed totemplates.file_annotate,
and now has an implicitselfparameter of typeAnnotationLine, instead of
Commit. All methods onCommitcan be accessed withcommit.method(), or
self.commit().method().
Deprecations
-
This release takes the first steps to make target revision required in
bookmark create,bookmark moveandbookmark set. Those commands will display
a warning if the user does not specify target revision explicitly. In the near
future those commands will fail if target revision is not specified. -
The
signing.sign-allconfig option has been deprecated in favor of
signing.behavior. The new option acceptsdrop(never sign),keep(preserve
existing signatures),own(sign own commits), orforce(sign all commits).
Existingsigning.sign-all = truetranslates tosigning.behavior = "own", and
falsetranslates to"keep". Invalid configuration is now an error.
New features
-
The new
jj signandjj unsigncommands allow for signing/unsigning commits.
jj signsupports configuring the default revset throughrevsets.signwhen
no--revisionsarguments are provided. -
jj git fetchnow supports string pattern syntax
on--remoteoption andgit.fetchconfiguration. -
Template functions
truncate_start()andtruncate_end()gained an optional
ellipsisparameter; passing this prepends or appends the ellipsis to the
content if it is truncated to fit the maximum width. -
Templates now support
stringify(x)function and string method
.escape_json(). The latter serializes the string in JSON format. It is
useful for making machine-readable templates by escaping problematic
characters like\n. -
Templates now support
trim(),trim_start()andtrim_end()methods
which remove whitespace from the start and end of aStringtype. -
The description of commits backed out by
jj backoutcan now be configured
usingtemplates.backout_description. -
New
AnnotationLinetemplater type. Used intemplates.file_annotate.
Providesself.commit(),.content(),.line_number(), and
.first_line_in_hunk(). -
Templates now have
format_short_operation_id(id)function for users to
customize the default operation id representation. -
The
jj init/jj revertstubs that print errors can now be overridden with
aliases. All ofjj clone/init/revertadd a hint to a generic error. -
Help text is now colored (when stdout is a terminal).
-
Commands that used to suggest
--ignore-immutablenow print the number of
immutable commits that would be rewritten if used and a link to the docs. -
jj undonow shows a hint when undoing an undo operation that the user may
be looking forjj op restoreinstead.
Fixed bugs
-
jj statusnow shows untracked files under untracked directories.
#5389 -
Added workaround for the bug that untracked files are ignored when watchman is
enabled. #5728 -
The
signing.backends.ssh.allowed-signersconfiguration option will now
expand~/to$HOME/.
#5626 -
config-schema.jsonnow allows arrays of strings for the settingsui.editor
andui.diff.tool. -
config-schema.jsonnow allows an array of strings or nested table for the
ui.pagersetting.
Contributors
Thanks to the people who made this release happen!
- Alain Leufroy (@aleufroy)
- Aleksey Kuznetsov (@zummenix)
- Alexander Mikhailov (@AM5800)
- Andrew Gilbert (@andyg0808)
- Antoine Martin (@alarsyo)
- Anton Bulakh (@necauqua)
- Austin Seipp (@thoughtpolice)
- Baltasar Dinis (@bsdinis)
- Benjamin Tan (@bnjmnt4n)
- Bryce Berger (@bryceberger)
- Burak Varlı (@unexge)
- David Rieber (@drieber)
- Emily (@emilazy)
- Evan Mesterhazy (@emesterhazy)
- George Christou (@gechr)
- HKalbasi (@HKalbasi)
- Ilya Grigoriev (@ilyagr)
- Jacob Hayes (@JacobHayes)
- Jonathan Frere (@MrJohz)
- Jonathan Tan (@jonathantanmy)
- Josh Steadmon (@steadmon)
- maan2003 (@maan2003)
- Martin von Zweigbergk (@martinvonz)
- Matthew Davidson (@KingMob)
- Philip Metzger (@PhilipMetzger)
- Philipp Albrecht (@pylbrecht)
- Roman Timushev (@rtimush)
- Samuel Tardieu (@samueltardieu)
- Scott Taylor (@scott2000)
- Stephan Hügel (@urschrei)
- Vincent Ging Ho Yim (@cenviity)
- Yuya Nishihara (@yuja)
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)
v0.25.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
It's the holidays, and this release was overall pretty quiet, without many major
changes. Two select improvements:
-
Improvements to configuration management, including support for conditional
variables in config files. -
Large files in the working copy will no longer cause commands to fail; instead
the large files will remain intact but untracked in the working copy.
Breaking changes
-
Configuration variables are no longer "stringly" typed. For example,
trueis
not converted to a string"true", and vice versa. -
The following configuration variables are now parsed strictly:
colors.<labels>,git.abandon-unreachable-commits,
git.auto-local-bookmark,git.push-bookmark-prefix,revsets.log,
revsets.short-prefixessigning.backend,operation.hostname,
operation.username,ui.allow-init-native,ui.color,
ui.default-description,ui.progress-indicator,ui.quiet,user.email,
user.name -
jj config listnow prints inline tables{ key = value, .. }literally.
Inner items of inline tables are no longer merged across configuration files.
See the table syntax documentation for details. -
jj config edit --usernow opens a file even if$JJ_CONFIGpoints to a
directory. If there are multiple config files, the command will fail. -
jj config setno longer accepts a bare string value that looks like a TOML
expression. For example,jj config set NAME '[foo]'must be quoted asjj config set NAME '"[foo]"'. -
The deprecated
[alias]config section is no longer respected. Move command
aliases to the[aliases]section. -
jj absorbnow abandons the source commit if it becomes empty and has no
description.
Deprecations
-
--config-toml=TOMLis deprecated in favor of--config=NAME=VALUEand
--config-file=PATH. -
The
Signature.username()template method is deprecated for
Signature().email().local().
New features
-
jjcommand no longer fails due to new working-copy files larger than the
snapshot.max-new-file-sizeconfig option. It will print a warning and large
files will be left untracked. -
Configuration files now support conditional variables.
-
New command options
--config=NAME=VALUEand--config-file=PATHto set
string value without quoting and to load additional configuration from files. -
Templates now support the
>=,>,<=, and<relational operators for
Integertypes. -
A new Email template type is added.
Signature.email()now returns an Email
template type instead of a String. -
Adds a new template alias
commit_timestamp(commit)which defaults to the
committer date. -
Conflict markers are now allowed to be longer than 7 characters, allowing
conflicts to be materialized and parsed correctly in files which already
contain lines that look like conflict markers. -
New
$marker_lengthvariable to allow merge tools to support longer conflict
markers (equivalent to "%L" for Git merge drivers). -
jj describenow accepts aJJ: ignore-restline that ignores everything
below it, similar to a "scissor line" in git. When editing multiple commits,
only ignore until the nextJJ: describeline.
Fixed bugs
-
The
$NO_COLORenvironment variable must now be non-empty to be respected. -
Fixed incompatible rendering of empty hunks in git/unified diffs. #5049
-
Fixed performance of progress bar rendering when fetching from Git remote. #5057
-
jj config path --userno longer creates new file at the default config path. -
On Windows, workspace paths (printed by
jj root) no longer use UNC-style
\\?\paths unless necessary. -
On Windows,
jj git clonenow converts local Git remote path to
slash-separated path. -
jj resolveno longer removes the executable bit on resolved files when using
an external merge tool.
Contributors
Thanks to the people who made this release happen!
- Alex Stefanov (@umnikos)
- Anton Älgmyr (@algmyr)
- Austin Seipp (@thoughtpolice)
- Benjamin Tan (@bnjmnt4n)
- Bryce Berger (@bryceberger)
- Daniel Ploch (@torquestomp)
- David Crespo (@david-crespo)
- George Tsiamasiotis (@gtsiam)
- Jochen Kupperschmidt (@homeworkprod)
- Keane Nguyen (@keanemind)
- Martin von Zweigbergk (@martinvonz)
- Matt Kulukundis (@fowles)
- Milo Moisson (@mrnossiom)
- petricavalry (@petricavalry)
- Philip Metzger (@PhilipMetzger)
- Remo Senekowitsch (@senekor)
- Scott Taylor (@scott2000)
- Shane Sveller (@shanesveller)
- Stephen Jennings (@jennings)
- Tim Janik (@tim-janik)
- Vamsi Avula (@avamsi)
- Waleed Khan (@arxanas)
- Yuya Nishihara (@yuja)
v0.24.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
-
New
jj absorbcommand automatically squashes changes from the current commit into relevant ancestor commits. -
Experimental dynamic shell completions have been added; see the docs for configuration.
-
jj duplicatenow accepts--destination/--insert-before/--insert-after. -
Some deprecated commands have been removed (
jj move,jj checkout,jj merge).
Breaking changes
-
jj movehas been removed. It was deprecated in 0.16.0. -
jj checkoutand the built-in aliasjj cohave been removed.
It was deprecated in 0.14.0. -
jj mergehas been removed. It was deprecated in 0.14.0. -
jj git pushno longer pushes new bookmarks by default. Use--allow-newto
bypass this restriction. -
Lines prefixed with "JJ:" in commit descriptions and in sparse patterns (from
jj sparse edit) are now stripped even if they are not immediately followed
by a space. #5004
Deprecations
New features
-
Templates now support the
==and!=logical operators forBoolean,
Integer, andStringtypes. -
New command
jj absorbthat moves changes to stack of mutable revisions. -
New command
jj util execthat can be used for arbitrary aliases. -
jj rebase -bcan now be used with the--insert-afterand--insert-before
options, likejj rebase -randjj rebase -s. -
A preview of improved shell completions was added. Please refer to the
documentation
to activate them. They additionally complete context-dependent, dynamic values
like bookmarks, aliases, revisions, operations and files. -
Added the config setting
snapshot.auto-update-stalefor automatically
runningjj workspace update-stalewhen applicable. -
jj duplicatenow accepts--destination,--insert-afterand
--insert-beforeoptions to customize the location of the duplicated
revisions. -
jj lognow displays the working-copy branch first. -
New
fork_point()revset function can be used to obtain the fork point
of multiple commits. -
The
tags()revset function now takes an optionalpatternargument,
mirroring that ofbookmarks(). -
Several commands now support
-f/-tshorthands for--from/--to:diffdiffeditinterdiffop diffrestore
-
New
ui.conflict-marker-styleconfig option to change how conflicts are
materialized in the working copy. The default option ("diff") renders
conflicts as a snapshot with a list of diffs to apply to the snapshot.
The new "snapshot" option renders conflicts as a series of snapshots, showing
each side and base of the conflict. The new "git" option replicates Git's
"diff3" conflict style, meaning it is more likely to work with external tools,
but it doesn't support conflicts with more than 2 sides. -
New
merge-tools.<TOOL>.conflict-marker-styleconfig option to override the
conflict marker style used for a specific merge tool. -
New
merge-tools.<TOOL>.merge-conflict-exit-codesconfig option to allow a
merge tool to exit with a non-zero code to indicate that not all conflicts
were resolved. -
jj simplify-parentsnow supports configuring the default revset when no
--sourceor--revisionsarguments are provided with the
revsets.simplify-parentsconfig.
Fixed bugs
jj config unset <TABLE-NAME>no longer removes a table (such as[ui].)
Contributors
Thanks to the people who made this release happen!
- Austin Seipp (@thoughtpolice)
- Benjamin Tan (@bnjmnt4n)
- Daniel Ploch (@torquestomp)
- Emily (@neongreen)
- Essien Ita Essien (@essiene)
- Herman J. Radtke III (@hjr3)
- Ilya Grigoriev (@ilyagr)
- Joaquín Triñanes (@JoaquinTrinanes)
- Lars Francke (@lfrancke)
- Luke Randall (@lukerandall)
- Martin von Zweigbergk (@martinvonz)
- Nathanael Huffman (@nathanaelhuffman)
- Philip Metzger (@PhilipMetzger)
- Remo Senekowitsch (@senekor)
- Robin Stocker (@robinst)
- Scott Taylor (@scott2000)
- Shane Sveller (@shanesveller)
- Tim Janik (@tim-janik)
- Yuya Nishihara (@yuja)
v0.23.0
Security fixes
- Fixed path traversal by cloning/checking out crafted Git repository containing
..,.jj,.gitpaths. (GHSA-88h5-6w7m-5w56; CVE-2024-51990)
Breaking changes
-
Revset function names can no longer start with a number.
-
Evaluation error of
revsets.short-prefixesconfiguration is now reported. -
The
HEAD@gitsymbol no longer resolves to the Git HEAD revision. Use
git_head()or@-revset expression instead. Thegit_headtemplate
keyword now returns a boolean. -
Help command doesn't work recursively anymore, i.e.
jj workspace help root
doesn't work anymore. -
The color label
op_logfrom the[colors]config section now only
applies to the op log and not to the other places operations are displayed. In
almost all cases, if you configuredop_logbefore, you should use the new
operationlabel instead. -
Default operation log template now shows end times of operations instead of
start times.
Deprecations
git.auto-local-bookmarkreplacesgit.auto-local-branch. The latter remains
supported for now (at lower precedence than the former).
New features
-
Added diff options to ignore whitespace when comparing lines. Whitespace
changes are still highlighted. -
New command
jj simplify-parentswill remove redundant parent edges. -
jj squashnow supports-f/-tshorthands for--from/--[in]to. -
Initial support for shallow Git repositories has been implemented. However,
deepening the history of a shallow repository is not yet supported. -
jj git clonenow accepts a--depth <DEPTH>option, which
allows to clone the repository with a given depth. -
New command
jj file annotatethat annotates files line by line. This is similar
in functionality togit blame. Invoke the command withjj file annotate <file_path>.
The output can be customized via thetemplates.annotate_commit_summary
config variable. -
jj bookmark listgained a--remote REMOTEoption to display bookmarks
belonging to a remote. This option can be combined with--trackedor
--conflicted. -
New command
jj config unsetthat unsets config values. For example,
jj config unset --user user.name. -
jj helpnow has the flag--keyword(shorthand-k), which can give help
for some keywords (e.g.jj help -k revsets). To see a list of the available
keywords you can dojj help --help. -
New
at_operation(op, expr)revset can be used in order to query revisions
based on historical state. -
String literals in filesets, revsets and templates now support hex bytes
(with\eas escape / shorthand for\x1b). -
New
coalesce(revsets...)revset which returns commits in the first revset
in therevsetslist that does not evaluate tonone(). -
New template function
raw_escape_sequence(...)preserves escape sequences. -
Timestamp objects in templates now have
after(date) -> Booleanand
before(date) -> Booleanmethods for comparing timestamps to other dates. -
New template functions
pad_start(),pad_end(),truncate_start(), and
truncate_end()are added. -
Add a new template alias
builtin_log_compact_full_description(). -
Added the config settings
diff.color-words.contextanddiff.git.contextto
control the default number of lines of context shown.
Fixed bugs
-
Error on
trunk()revset resolution is now handled gracefully.
#4616 -
Updated the built-in diff editor
scm-recordto version
0.4.0, which
includes multiple fixes.
Contributors
Thanks to the people who made this release happen!
- Alec Snyder (@allonsy)
- Arthur Grillo (Grillo-0)
- Austin Seipp (@thoughtpolice)
- Benjamin Tan (@bnjmnt4n)
- Dave Townsend (@Mossop)
- Daniel Ploch (@torquestomp)
- Emily (@neongreen)
- Essien Ita Essien (@essiene)
- Fedor Sheremetyev (@sheremetyev)
- Ilya Grigoriev (@ilyagr)
- Jakub Okoński (@farnoy)
- Jcparkyn (@Jcparkyn)
- Joaquín Triñanes (@JoaquinTrinanes)
- Lukas Wirth (@Veykril)
- Marco Neumann (@crepererum)
- Martin von Zweigbergk (@martinvonz)
- Matt Stark (@matts1)
- Philip Metzger (@PhilipMetzger)
- Philipp Albrecht (@pylbrecht)
- Remo Senekowitsch (@senekor)
- Richard Macklin (@rmacklin)
- Robin Stocker (@robinst)
- Samuel Tardieu (@samueltardieu)
- Sora (@SoraTenshi)
- Stephen Jennings (@jennings)
- Theodore Ehrenborg (@TheodoreEhrenborg)
- Vamsi Avula (@avamsi)
- Vincent Ging Ho Yim (@cenviity)
- Yuya Nishihara (@yuja)