Releases: jj-vcs/jj
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)
v0.22.0
Breaking changes
-
Fixing #4239 means the
ordering of some messages have changed. -
Invalid
ui.graph.styleconfiguration is now an error. -
The builtin template
branch_listhas been renamed tobookmark_listas part
of thejj branchdeprecation.
Deprecations
-
jj branchhas been deprecated in favor ofjj bookmark.Rationale: Jujutsu's branches don't behave like Git branches, which a
confused many newcomers, as they expected a similar behavior given the name.
We've renamed them to "bookmarks" to match the actual behavior, as we think
that describes them better, and they also behave similar to Mercurial's
bookmarks. -
jj obslogis now calledjj evolution-log/jj evolog.jj obslogremains
as an alias. -
jj unsquashhas been deprecated in favor ofjj squashand
jj diffedit --restore-descendants.Rationale:
jj squashcan be used in interactive mode to pull
changes from one commit to another, including from a parent commit
to a child commit. For fine-grained dependent diffs, such as when
the parent and the child commits must successively modify the same
location in a file,jj diffedit --restore-descendantscan be used
to set the parent commit to the desired content without altering the
content of the child commit. -
The
git.push-branch-prefixconfig has been deprecated in favor of
git.push-bookmark-prefix. -
conflict()andfile()revsets have been renamed toconflicts()andfiles()
respectively. The old names are still around and will be removed in a future
release.
New features
-
The new config option
snapshot.auto-tracklets you automatically track only
the specified paths (all paths by default). Use the newjj file track
command to manually tracks path that were not automatically tracked. There is
no way to list untracked files yet. Usegit statusin a colocated workspace
as a workaround.
#323 -
jj fixnow allows fixing unchanged files with the--include-unchanged-filesflag. This
can be used to more easily introduce automatic formatting changes in a new
commit separate from other changes. -
jj workspace addnow accepts a--sparse-patterns=<MODE>option, which
allows control of the sparse patterns for a newly created workspace:copy
(inherit from parent; default),full(full working copy), orempty(the
empty working copy). -
New command
jj workspace renamethat can rename the current workspace. -
jj op loggained an option to include operation diffs. -
jj git clonenow accepts a--remote <REMOTE NAME>option, which
allows to set a name for the remote instead of using the default
origin. -
jj op undonow reports information on the operation that has been undone. -
jj squash: the-kflag can be used as a shorthand for--keep-emptied. -
CommitId / ChangeId template types now support
.normal_hex(). -
jj commitandjj describenow accept--authoroption allowing to quickly change
author of given commit. -
jj diffedit,jj abandon, andjj restorenow accept a--restore-descendants
flag. When used, descendants of the edited or deleted commits will keep their original
content. -
jj git fetch -b <remote-git-branch-name>will now warn if the branch(es)
can not be found in any of the specified/configured remotes. -
jj splitnow lets the user select all changes in interactive mode. This may be used
to keeping all changes into the first commit while keeping the current commit
description for the second commit (the newly created empty one). -
Author and committer names are now yellow by default.
Fixed bugs
-
Update working copy before reporting changes. This prevents errors during reporting
from leaving the working copy in a stale state. -
Fixed panic when parsing invalid conflict markers of a particular form.
(#2611) -
Editing a hidden commit now makes it visible.
-
The
present()revset now suppresses missing working copy error. For example,
present(@)evaluates tonone()if the current workspace has no
working-copy commit.
Contributors
Thanks to the people who made this release happen!
- Austin Seipp (@thoughtpolice)
- Danny Hooper (@hooper)
- Emily Shaffer (@nasamuffin)
- Essien Ita Essien (@essiene)
- Ethan Brierley (@eopb)
- Ilya Grigoriev (@ilyagr)
- Kevin Liao (@kevincliao)
- Lukas Wirth (@Veykril)
- Martin von Zweigbergk (@martinvonz)
- Mateusz Mikuła (@mati865)
- mlcui (@mlcui-corp)
- Philip Metzger (@PhilipMetzger)
- Samuel Tardieu (@samueltardieu)
- Stephen Jennings (@jennings)
- Tyler Goffinet (@qubitz)
- Vamsi Avula (@avamsi)
- Yuya Nishihara (@yuja)
v0.21.0
Breaking changes
next/prevwill no longer infer when to go into edit mode when moving from
commit to commit. It now either follows the flags--edit|--no-editor it
gets the mode fromui.movement.edit.
Deprecations
jj untrackhas been renamed tojj file untrack.
New features
-
Add new boolean config knob,
ui.movement.editfor controlling the behaviour
ofprev/next. The flag turnseditmodeonandoffpermanently when set
respectively totrueorfalse. -
All diff formats except
--name-onlynow include information about copies and
moves. So do external diff tools in file-by-file mode.jj statusalso
includes information about copies and moves. -
Color-words diff has gained an option to display complex changes as separate
lines. It's enabled by default. To
restore the old behavior, setdiff.color-words.max-inline-alternation = -1. -
A tilde (
~) at the start of the path will now be expanded to the user's home
directory when configuring asigning.keyfor SSH commit signing. -
When reconfiguring the author, warn that the working copy won't be updated
Fixed bugs
- Release binaries for Intel Macs have been restored. They were previously
broken due to using a sunset version of GitHub's macOS runners (but nobody had
previously complained.)
Contributors
Thanks to the people who made this release happen!
- Aaron Bull Schaefer (@elasticdog)
- Austin Seipp (@thoughtpolice)
- Benjamin Tan (@bnjmnt4n)
- Raniz Daniel Raneland (@Raniz85)
- Daniel Ploch (@torquestomp)
- Essien Ita Essien (@essiene)
- Ilya Grigoriev (@ilyagr)
- Kaleb Pace (@kalebpace)
- Marie (@NyCodeGHG)
- Marijan Smetko (@InCogNiTo124)
- Martin von Zweigbergk (@martinvonz)
- Matt Kulukundis (@fowles)
- Scott Taylor (@scott2000)
- Stephen Jennings (@jennings)
- tingerrr (@tingerrr)
- Yuya Nishihara (@yuja)
v0.20.0
Note to packagers
jjnow linkslibgit2statically by default. To use dynamic linking, you
need to set the environment variableLIBGIT2_NO_VENDOR=1while compiling.
(#4163)
Breaking changes
-
jj rebase --skip-emptyhas been renamed tojj rebase --skip-emptied -
jj backout --revisionhas been renamed tojj backout --revisions.
The short alias-ris still supported. -
The default
immutable_heads()set
now includesuntracked_remote_branches()with the assumption that untracked
branches aren't managed by you. Therefore, untracked branches are no longer
displayed injj logby default. -
Updated defaults for graph node symbol templates
templates.log_nodeand
templates.op_log_node. -
The "fileset" language is now enabled by default. It can
still be disable by settingui.allow-filesets=false. -
On
jj git fetch/import, commits referred to byHEAD@gitare no longer
preserved. If a checked-out named branch gets deleted locally or remotely, the
corresponding commits will be abandoned. -
jj --at-op=@no longer merges concurrent operations if explicitly specified. -
jj obslog -pno longer shows diffs at non-partial squash operations.
Previously, it showed the same diffs as the second predecessor.
Deprecations
- The original configuration syntax for
jj fixis now deprecated in favor of
one that allows defining multiple tools that can affect different filesets.
These can be used in combination for now. Seejj help fixfor details.
New features
-
External diff tools can now be configured to invoke the tool on each file
individually instead of being passed a directory by setting
merge-tools.$TOOL.diff-invocation-mode="file-by-file"in config.toml. -
In git diffs, word-level hunks are now highlighted with underline. See diff
colors and styles for customization. -
New
.diff().<format>()commit template methods are added. They can be used
in order to show diffs conditionally. For example,
if(current_working_copy, diff.summary()). -
jj git cloneandjj git initwith an existing git repository adds the
default branch of the remote as repository settings for
revset-aliases."trunk()".` -
jj workspace forgetnow abandons the workspace's working-copy commit if it
was empty. -
jj backoutnow includes the backed out commit's subject in the new commit
message. -
jj backoutcan now back out multiple commits at once. -
jj git clone some/nested/pathnow creates the full directory tree for
nested destination paths if they don't exist. -
String patterns now support case‐insensitive matching by suffixing any
pattern kind with-i.mine()uses case‐insensitive matching on your email
address unconditionally. Only ASCII case folding is currently implemented,
but this will likely change in the future. -
String patterns now support
regex:"pattern". -
New
tracked_remote_branches()anduntracked_remote_branches()revset
functions can be used to select tracked/untracked remote branches. -
The
file()revset function now accepts fileset as argument. -
New
diff_contains()revset function can be used to search diffs. -
New command
jj operation diffthat can compare changes made between two
operations. -
New command
jj operation showthat can show the changes made in a single
operation. -
New config setting
git.private-commitsto prevent commits from being pushed. -
The default commit description template
can now be configured bytemplates.draft_commit_description. -
jj fixcan now be configured to run different tools on different filesets.
This simplifies the use case of configuring code formatters for specific file
types. Seejj help fixfor details. -
Added revset functions
author_dateandcommitter_date. -
jj describecan now update the description of multiple commits.
Fixed bugs
-
jj statuswill show different messages in a conflicted tree, depending
on the state of the working commit. In particular, if a child commit fixes
a conflict in the parent, this will be reflected in the hint provided
byjj status -
jj diff --gitno longer shows the contents of binary files. -
Windows binaries no longer require
vcruntime140.dllto be installed
(normally through Visual Studio.) -
On quit, the builtin pager no longer waits for all outputs to be discarded.
-
jj branch renameno longer shows a warning in colocated repos.
Contributors
Thanks to the people who made this release happen!
- Anton Älgmyr (@algmyr)
- Austin Seipp (@thoughtpolice)
- Benjamin Tan (@bnjmnt4n)
- Daniel Ploch (@torquestomp)
- Danny Hooper (@hooper)
- Emily (@emilazy)
- Essien Ita Essien (@essiene)
- Erich Gubler (@ErichDonGubler)
- Fedor Sheremetyev (@sheremetyev)
- Ilya Grigoriev (@ilyagr)
- Jonathan Tan (@jonathantanmy)
- Julien Vincent (@julienvincent)
- Martin von Zweigbergk (@martinvonz)
- Matt Kulukundis (@fowles)
- Matt Stark (@matts1)
- mlcui (@mlcui-corp)
- Philip Metzger (@PhilipMetzger)
- Scott Taylor (@scott2000)
- Skyler Grey (@Minion3665)
- Stephen Jennings (@jennings)
- Tim Janik (@tim-janik)
- Vincent Ging Ho Yim (@cenviity)
- Vladimír Čunát (@vcunat)
- Vladimir (@0xdeafbeef)
- Yuya Nishihara (@yuja)
v0.19.0
Breaking changes
-
In revset aliases, top-level
kind:patternexpression is now parsed as
modifier. Surround with parentheses if it should be parsed as string/file
pattern. -
Dropped support for automatic upgrade of repo formats used by versions before
0.12.0. -
jj fixnow defaults to the broader revset-s reachable(@, mutable())
instead of-s @. -
Dropped support for deprecated
jj branch delete/forget--globoption. -
jj branch setnow creates new branch if it doesn't exist. Usejj branch moveto ensure that the target branch already exists.
#3584
Deprecations
-
Replacing
-lshorthand for--limitwith-ninjj log,jj op log
andjj obslog. -
jj split --siblingsis deprecated in favor ofjj split --parallel(to
matchjj parallelize). -
A new
jj filesubcommand now replaces several existing uncategorized
commands, which are deprecated.jj file showreplacesjj cat.jj file chmodreplacesjj chmod.jj file listreplacesjj files.
New features
-
Support background filesystem monitoring via watchman triggers enabled with
thecore.watchman.register_snapshot_trigger = trueconfig. -
Show paths to config files when configuration errors occur.
-
jj fixnow supports configuring the default revset for-susing the
revsets.fixconfig. -
The
descendants()revset function now accepts an optionaldepthargument;
like theancestors()depth argument, it limits the depth of the set. -
Revset/template aliases now support function overloading.
#2966 -
Conflicted files are individually simplified before being materialized.
-
The
jj filesubcommand now contains several existing file utilities.jj file show, replacingjj cat.jj file chmodreplacingjj chmod.jj file listreplacingjj files.
-
New command
jj branch movelet you update branches by name pattern or source
revision. -
New diff option
jj diff --name-onlyallows for easier shell scripting. -
In color-words diffs, hunks are now highlighted with underline. See diff
colors and styles for customization. -
jj git push -c <arg>can now accept revsets that resolve to multiple
revisions. This means thatjj git push -c xyz -c abcis now equivalent to
jj git push -c 'all:(xyz | abc)'. -
jj prevandjj nexthave gained a--conflictflag which moves you
to the next conflict in a child commit. -
New command
jj git remote set-urlthat sets the url of a git remote. -
Author timestamp is now reset when rewriting discardable commits (empty
commits with no description) if authored by the current user.
#2000 -
jj commitnow accepts--reset-authoroption to matchjj describe. -
jj squashnow accepts a--keep-emptiedoption to keep the source commit.
Fixed bugs
-
jj git pushnow ignores immutable commits when checking whether a
to-be-pushed commit has conflicts, or has no description / committer / author
set. #3029 -
jjwill look for divergent changes outside the short prefix set even if it
finds the change id inside the short prefix set.
#2476
Contributors
Thanks to the people who made this release happen!
- Austin Seipp (@thoughtpolice)
- Benjamin Tan (@bnjmnt4n)
- Daniel Ploch (@torquestomp)
- Danny Hooper (@hooper)
- Ilya Grigoriev (@ilyagr)
- James Sully (@sullyj3)
- Jonathan Tan (@jonathantanmy)
- Kyle J Strand (@BatmanAoD)
- Manuel Caldeira (@KiitoX)
- Martin von Zweigbergk (@martinvonz)
- Matt Kulukundis (@fowles)
- Matt Stark (@matts1)
- mlcui (@mlcui-corp)
- Philip Metzger (@PhilipMetzger)
- Scott Taylor (@scott2000)
- Simon Wollwage (@Kintaro)
- Tal Pressman (@tp-woven)
- Yuya Nishihara (@yuja)