Releases: jj-vcs/jj
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)
v0.18.0
Breaking changes
-
Dropped support for
ui.default-revsetconfig (replaced byrevsets.login
0.8.0). -
The
commit_summary_no_branchestemplate is superseded by
templates.branch_list. -
jj splitwill now refuse to split an empty commit. -
jj config listnow uses multi-line strings and single-quoted strings in the
output when appropriate. -
jj config get/list/setnow parsenameargument as TOML
key. Quote meta characters as needed.
Example:jj config get "revset-aliases.'trunk()'" -
When updating the working copy away from an empty and undescribed commit, it
is now abandoned even if it is a merge commit. -
If a new working-copy commit is created because the old one was abandoned, and
the old commit was merge, then the new commit will now also be.
#2859 -
jj new's--insert-before/--insert-afteroptions must now be set for each
commit the new commit will be inserted before/after. Previously, those options
were global flags and specifying them once would insert the new commit before/
after all the specified commits.
Deprecations
- Attempting to alias a built-in command now gives a warning, rather than being
silently ignored.
New features
-
jj branch list/tag listnow accept-T/--templateoption. The tag list
prints commit summary along with the tag name by default. -
Conflict markers now include an explanation of what each part of the conflict
represents. -
ui.color = "debug"prints active labels alongside the regular colored output. -
jj branch tracknow show conflicts if there are some. -
A new revset
reachable(srcs, domain)will return all commits that are
reachable fromsrcswithindomain. -
There are now prebuilt binaries for
aarch64-linux-unknown-musl.
Note, these are cross compiled and currently untested.
We plan on providing fully tested builds later once our CI system allows it. -
Added new revsets
mutable()andimmutable(). -
Upgraded
scm-recordfrom v0.2.0 to v0.3.0. See release notes at
https://github.com/arxanas/scm-record/releases/tag/v0.3.0 -
New command
jj fixthat can be configured to update commits by running code
formatters (or similar tools) on changed files. The configuration schema and
flags are minimal for now, with a number of improvements planned (for example,
#3800 and
#3801). -
jj new's--insert-beforeand--insert-afteroptions can now be used
simultaneously. -
jj git pushnow can push commits with empty descriptions with the
--allow-empty-descriptionflag
Fixed bugs
-
Previously,
jj git pushonly made sure that the branch is in the expected
location on the remote server when pushing a branch forward (as opposed to
sideways or backwards). Now,jj git pushmakes a safety check in all cases
and fails wheneverjj git fetchwould have introduced a conflict.In other words, previously branches that moved sideways or backward were
pushed similarly to Git'sgit push --force; now they have protections
similar togit push --force-with-lease(though not identical to it, to match
the behavior ofjj git fetch). Note also that because of the wayjj git fetchworks,jjdoes not suffer from the same problems as Git'sgit push --force-with-leasein situations whengit fetchis run in the background. -
When the working copy commit becomes immutable, a new one is automatically created
on top of it to avoid letting the user edit the immutable one. -
jj config listnow properly escapes TOML keys (#1322). -
Files with conflicts are now checked out as executable if all sides of the
conflict are executable. -
The progress bar (visible when using e.g.
jj git clone) clears the
remainder of the cursor row after drawing rather than clearing the entire row
before drawing, eliminating the "flicker" effect seen on some terminals.
Contributors
Thanks to the people who made this release happen!
- Alexander Potashev (@aspotashev)
- Austin Seipp (@thoughtpolice)
- Benjamin Tan (@bnjmnt4n)
- Charles Crete (@Cretezy)
- Daniel Ploch (@torquestomp)
- Danny Hooper (@hooper)
- Eidolon (@HybridEidolon)
- Glen Choo (@chooglen)
- Gregory Anders (@gpanders)
- Ilya Grigoriev (@ilyagr)
- jyn (@jyn514)
- Martin von Zweigbergk (@martinvonz)
- Matt Stark (@matts1)
- Matthew Davidson (@KingMob)
- Michael Gattozzi (@mgattozzi)
- mlcui (@mlcui-corp)
- Philip Metzger (@PhilipMetzger)
- Remo Senekowitsch (@senekor)
- Thomas Castiglione (@gulbanana)
- Théo Daron (@tdaron)
- tinger (@tingerrr)
- Waleed Khan (@arxanas)
- Yuya Nishihara (@yuja)
v0.17.1
Fixed bugs
jj statusno longer scans through the entire history to look for ancestors with conflicts.