Releases: jj-vcs/jj
v0.36.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 documentation has moved from https://jj-vcs.github.io/jj/ to
https://docs.jj-vcs.dev/.301 redirects are being issued towards the new domain, so any existing links
should not be broken. -
Fixed race condition that could cause divergent operations when running
concurrentjjcommands in colocated repositories. It is now safe to
continuously run e.g.jj logwithout--ignore-working-copyin one
terminal while you're running other commands in another terminal.
#6830 -
jjnow ignores$PAGERset in the environment and usesless -FRXon most
platforms (:builtinon Windows). See the docs for
more information, and #3502 for
motivation.
Breaking changes
-
In filesets or path patterns, glob matching
is enabled by default. You can usecwd:"path"to match literal paths. -
In the following commands, string pattern
arguments are now parsed the same way they
are in revsets and can be combined with logical operators:jj bookmark delete/forget/list/move,jj tag delete/list,jj git clone/fetch/push -
In the following commands, unmatched bookmark/tag names is no longer an
error. A warning will be printed instead:jj bookmark delete/forget/move/track/untrack,jj tag delete,jj git clone/push -
The default string pattern syntax in revsets will be changed to
glob:in a
future release. You can opt in to the new default by setting
ui.revsets-use-glob-by-default=true. -
Upgraded
scm-recordfrom v0.8.0 to v0.9.0. See release notes at
https://github.com/arxanas/scm-record/releases/tag/v0.9.0. -
The minimum supported Rust version (MSRV) is now 1.89.
-
On macOS, the deprecated config directory
~/Library/Application Support/jj
is not read anymore. Use$XDG_CONFIG_HOME/jjinstead (defaults to
~/.config/jj). -
Sub-repos are no longer tracked. Any directory containing
.jjor.git
is ignored. Note that Git submodules are unaffected by this.
Deprecations
-
The
--destination/-darguments forjj rebase,jj split,jj revert,
etc. were renamed to--onto/-o. The reasoning is that--onto,
--insert-before, and--insert-afterare all destination arguments, so
calling one of them--destinationwas confusing and unclear. The old names
will be removed at some point in the future, but we realize that they are
deep in muscle memory, so you can expect an unusually long deprecation period. -
jj describe --editis deprecated in favor of--editor. -
The config options
git.auto-local-bookmarkandgit.push-new-bookmarksare
deprecated in favor ofremotes.<name>.auto-track-bookmarks. For example:[remotes.origin] auto-track-bookmarks = "glob:*"
For more details, refer to
the docs. -
The flag
--allow-newonjj git pushis deprecated. In order to push new
bookmarks, please track them withjj bookmark track. Alternatively, consider
setting up an auto-tracking configuration to avoid the chore of tracking
bookmarks manually. For example:[remotes.origin] auto-track-bookmarks = "glob:*"
For more details, refer to
the docs.
New features
-
jj commit,jj describe,jj squash, andjj splitnow accept
--editor, which ensures an editor will be opened with the commit
description even if one was provided via--message/-m. -
All
jjcommands show a warning when the providedfilesetexpression
doesn't match any files. -
Added
files()template function toDiffStats. This supports per-file stats
likelines_added()andlines_removed() -
Added
join()template function. This is different fromseparate()in that
it adds a separator between all arguments, even if empty. -
RepoPathtemplate type now has aabsolute() -> Stringmethod that returns
the absolute path as a string. -
Added
format_path(path)template that controls how file paths are printed
withjj file list. -
New built-in revset aliases
visible()andhidden(). -
Unquoted
*is now allowed in revsets.bookmarks(glob:foo*)no longer
needs quoting. -
jj prev/next --no-editnow generates an error if the working-copy has some
children. -
A new config option
remotes.<name>.auto-track-bookmarkscan be set to a
string pattern. New bookmarks matching it will be automatically tracked for
the specified remote. See
the docs. -
jj lognow supports a--countflag to print the number of commits instead
of displaying them.
Fixed bugs
-
jj fixnow prints a warning if a tool failed to run on a file.
#7971 -
Shell completion now works with non‑normalized paths, fixing the previous
panic and allowing prefixes containing.or..to be completed correctly.
#6861 -
Shell completion now always uses forward slashes to complete paths, even on
Windows. This renders completion results viable when using jj in Git Bash.
#7024 -
Unexpected keyword arguments now return a parse failure for the
coalesce()
andconcat()templating functions. -
Nushell completion script documentation add
-foption, to keep it up to
date.
#8007 -
Ensured that with Git submodules, remnants of your submodules do not show up
in the working copy after runningjj new.
#4349
Contributors
Thanks to the people who made this release happen!
- abgox (@abgox)
- ase (@adamse)
- Björn Kautler (@Vampire)
- Bryce Berger (@bryceberger)
- Chase Naples (@cnaples79)
- David Higgs (@higgsd)
- edef (@edef1c)
- Evan Mesterhazy (@emesterhazy)
- Fedor (@sheremetyev)
- Gaëtan Lehmann (@glehmann)
- George Christou (@gechr)
- Hubert Lefevre (@Paluche)
- Ilya Grigoriev (@ilyagr)
- Jonas Greitemann (@jgreitemann)
- Joseph Lou (@josephlou5)
- Julia DeMille (@judemille)
- Kaiyi Li (@06393993)
- Kyle Lippincott (@spectral54)
- Lander Brandt (@landaire)
- Lucio Franco (@LucioFranco)
- Luke Randall (@lukerandall)
- Martin von Zweigbergk (@martinvonz)
- Matt Stark (@matts1)
- Mitchell Skaggs (@magneticflux-)
- Peter Schilling (@schpet)
- Philip Metzger (@PhilipMetzger)
- QingyaoLin (@QingyaoLin)
- Remo Senekowitsch (@senekor)
- Scott Taylor (@scott2000)
- Stephen Jennings (@jennings)
- Steve Klabnik (@steveklabnik)
- Tejas Sanap (@whereistejas)
- Tommi Virtanen (@tv42)
- Velociraptor115 (@Velociraptor115)
- Vincent Ging Ho Yim (@cenviity)
- Yuya Nishihara (@yuja)
v0.35.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
-
Workspaces can now have their own separate configuration. For instance, you
can usejj config set --workspaceto update a configuration option only in
the current workspace. -
After creating a local bookmark, it is now possible to use
jj bookmark track
to associate the bookmark with a specific remote before pushing it. When
pushing a tracked bookmark, it is not necessary to use--allow-new. -
The new
jj git colocation enableandjj git colocation disablecommands
allow converting between colocated and non-colocated workspaces.
Breaking changes
-
The
remote_bookmarks(remote=pattern)revset now includes Git-tracking
bookmarks if the specifiedpatternmatchesgit. The default is
remote=~exact:"git"as before. -
The deprecated flag
--summaryofjj abandonhas been removed. -
The deprecated command
jj backouthas been removed, usejj revertinstead. -
The following deprecated config options have been removed:
signing.sign-allcore.watchman.register_snapshot_triggerdiff.format
Deprecations
-
jj bisect run --command <cmd>is deprecated in favor of
jj bisect run -- <cmd>. -
jj metaedit --update-committer-timestampwas renamed to
jj metaedit --force-rewritesince the old name (and help text)
incorrectly suggested that the committer name and email would not
be updated.
New features
-
Workspaces may have an additional layered configuration, located at
.jj/workspace-config.toml.jj configsubcommands which took layer options
like--reponow also support--workspace. -
jj bookmark trackcan now associate new local bookmarks with remote.
Tracked bookmarks can be pushed without--allow-new.
#7072 -
The new
jj git colocationcommand provides sub-commands to show the
colocation state (status), to convert a non-colocated workspace into
a colocated workspace (enable), and vice-versa (disable). -
New
jj tag set/deletecommands to create/update/delete tags locally.
Created/updated tags are currently always exported to Git as lightweight
tags. If you would prefer them to be exported as annotated tags, please give
us feedback on #7908. -
Templates now support a
.split(separator, [limit])method on strings to
split a string into a list of substrings. -
-Gis now available as a short form of--no-graphinjj log,jj evolog,
jj op log,jj op showandjj op diff. -
jj metaeditnow accepts-m/--messageoption to non-interactively update
the change description. -
The
CryptographicSignature.key()template method now also works for SSH
signatures and returns the corresponding public key fingerprint. -
Added
template-aliases.empty_commit_marker. Users can override this value in
their config to change the "(empty)" label on empty commits. -
Add support for
--when.workspacesconfig scopes. -
Add support for
--when.hostnamesconfig scopes. This allows configuration to
be conditionally applied based on the hostname set inoperation.hostname. -
jj bisect runaccepts the command and arguments to pass to the command
directly as positional arguments, such as
jj bisect --range=..main -- cargo check --all-targets. -
Divergent changes are no longer marked red in immutable revisions. Since the
revision is immutable, the user shouldn't take any action, so the red color
was unnecessarily alarming. -
New commit template keywords
local/remote_tagsto show only local/remote
tags. These keywords may be useful in non-colocated Git repositories where
local and exported@gittags can point to different revisions. -
jj git clonenow supports the--branchoption to specify the branch(es)
to fetch during clone. If present, the first matching branch is used as the
working-copy parent. -
Revsets now support logical operators in string patterns.
Fixed bugs
-
jj metaedit --author-timestamptwice with the same value no longer
edits the change twice in some cases. -
jj squash: fixed improper revision rebase when both--insert-afterand
--insert-beforewere used. -
jj undocan now revert "fetch"/"import" operation that involves tag updates.
#6325 -
Fixed parsing of
files(expr)revset expression including parentheses.
#7747 -
Fixed
jj describe --stdinto append a final newline character.
Contributors
Thanks to the people who made this release happen!
- Alpha Chen (@kejadlen)
- Angel Ezquerra (@AngelEzquerra)
- ase (@adamse)
- Austin Seipp (@thoughtpolice)
- Benjamin Brittain (@benbrittain)
- bipul (@bipulmgr)
- Brian Schroeder (@bts)
- Bryce Berger (@bryceberger)
- Cole Helbling (@cole-h)
- Daniel Luz (@mernen)
- David Higgs (@higgsd)
- Defelo (@Defelo)
- Fedor (@sheremetyev)
- Gabriel Goller (@kaffarell)
- Gaëtan Lehmann (@glehmann)
- George Christou (@gechr)
- Ilya Grigoriev (@ilyagr)
- Isaac Corbrey (@icorbrey)
- James Coman (@jamescoman)
- Joseph Lou (@josephlou5)
- Lander Brandt (@landaire)
- Martin von Zweigbergk (@martinvonz)
- Michael Chirico (@MichaelChirico)
- Owen Brooks (@owenbrooks)
- Peter Schilling (@schpet)
- Philip Metzger (@PhilipMetzger)
- Remo Senekowitsch (@senekor)
- Ross Smyth (@RossSmyth)
- Scott Taylor (@scott2000)
- Steve Fink (@hotsphink)
- Steve Klabnik (@steveklabnik)
- Theo Buehler (@botovq)
- Theodore Dubois (@tbodt)
- Theodore Keloglou (@sirodoht)
- Yuya Nishihara (@yuja)
v0.34.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
-
Support for uploading changes to Gerrit Code Review with
jj gerrit upload.
This lets you submit trees or multiple stacks of work at once. Support
for fetching changes, submitting changes, and other operations is not yet
implemented. This should be considered experimental, and we welcome feedback
on using it. -
Support for automated bisection using
jj bisect run; this will continuously
bisect a commit range until a given commit is found to trigger a bug.
Breaking changes
-
Git-based repositories are now colocated by default. Configure
git.colocate = falseto keep the previous behavior. -
Conflicts written by jj < 0.11 are no longer supported. They will now appear
as regular files with a.jjconflictsuffix and JSON contents. -
The minimum supported Rust version (MSRV) is now 1.88.
Deprecations
-
Various flags on
jj describeandjj commithave been deprecated in favor
ofjj metaedit. They are:describe:--author,--reset-author,--no-editcommit:--author,--reset-author
-
The storage format of remote bookmarks and tags has changed. Remote bookmarks
will be written in both old and new formats to retain forward compatibility.
Git-tracking tags are also recorded for future native tagging support. This
change should be transparent, but let us know if you see anything odd.
New features
-
The new command
jj bisect runuses binary search to find a commit that
introduced a bug. -
The default editor on Unix is now
nanoinstead ofpico. -
New config option
merge.hunk-level = "word"to enable word-level merging. -
New config option
merge.same-change = "keep"to disable lossy resolution
rule for same-change conflicts.
#6369 -
Templates now support a
replace()method on strings for pattern-based
string replacement with optional limits. Supports all string patterns, including
regex with capture groups (e.g."hello world".replace(regex:'(\w+) (\w+)', "$2 $1")). -
A new builtin
hyperlink(url, text)template alias creates clickable
hyperlinks using OSC8 escape sequences
for terminals that support them. -
Added a new conditional configuration
--when.platformsto include
settings only on certain platforms. -
External diff commands now support substitution variable
$widthfor the
number of available terminal columns. -
The new
jj gerrit uploadcommand allows you to upload given revisions to an
instance of Gerrit Code Review. -
jj bookmark create/set/moveuse the working copy as a default again and
no longer require an explicit revision argument. This walks back a
deprecation fromjj 0.26, as the community feedback was mostly negative.
Instead, bookmarking an empty revision now produces a warning, to help you
catch the case where you meant to bookmark the parent revision. -
The revset function
exactly(x, n)will now evaluatexand error if it does
not have exactlynelements. -
jj util execnow matches the exit status of the program it runs, and
doesn't print anything. -
jj config getnow supports displaying array and table config values. -
jj util execsets the environment variableJJ_WORKSPACE_ROOT
Fixed bugs
- Fetching repositories that have submodules no longer errors even if
submodule.recurse=trueis set in.gitconfig(but jj still isn't able to
fetch the submodules or to operate on them).
Contributors
Thanks to the people who made this release happen!
- Angel Ezquerra (@AngelEzquerra)
- Anton Älgmyr (@algmyr)
- Antonin Delpeuch (@wetneb)
- Austin Seipp (@thoughtpolice)
- Benjamin Tan (@bnjmnt4n)
- Conner Petzold (@ConnerPetzold)
- Daniel Luz (@mernen)
- Daniele Sassoli (@DanieleSassoli)
- David Barsky (@davidbarsky)
- Dinu Blanovschi (@dnbln)
- Gaëtan Lehmann (@glehmann)
- George Christou (@gechr)
- Ian Wrzesinski (@isuffix)
- Ilya Grigoriev (@ilyagr)
- Isaac Corbrey (@icorbrey)
- Ivan Petkov (@ipetkov)
- Jonas Fierlings (@PigeonF)
- loudgolem (@phanirithvij)
- Martin von Zweigbergk (@martinvonz)
- Matt Stark (@matts1)
- Matt T. Proud (@matttproud)
- Michael Pratt (@prattmic)
- MochikoNyan (@MochikoNyan)
- Philip Metzger (@PhilipMetzger)
- Reilly Brogan (@ReillyBrogan)
- Remo Senekowitsch (@senekor)
- Reuven Lazarus (@rlazarus)
- Scott Taylor (@scott2000)
- Stephen Jennings (@jennings)
- Steven Sherry (@Steven0351)
- Theo Buehler (@botovq)
- Yuya Nishihara (@yuja)
v0.33.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
-
jj undois now sequential: invoking it multiple times in sequence
repeatedly undoes actions in the operation log. Previously,jj undowould
only undo the most recent operation in the operation log. As a result, a new
jj redocommand has been added. -
Experimental support for improving query performance over filesets and file
queries (likejj log path/to/file.txt) has been added. This is not enabled
by default. To enable this, you must use thejj debug index-changed-paths
command.
Breaking changes
-
jj evologtemplates now acceptCommitEvolutionEntryas context type. To
getCommitproperties, usecommit.<method>(). To customize the default
output, settemplates.evologinstead oftemplates.log. -
jj op shownow usestemplates.op_showconfiguration for its default template
instead oftemplates.op_log. -
The deprecated config option
git.auto-local-branchhas been removed. Use
git.auto-local-bookmarkinstead. -
The deprecated
Signature.username()template method has been removed. Use
Signature.email().local()instead. -
The deprecated
--config-tomlflag has been removed. Use
--config=NAME=VALUEor--config-file=PATHinstead. -
jj undocan now undo multiple operations progressively by calling it
repeatedly, whereas previously, runningjj undotwice was previously a no-op
(it only undid the last change). -
jj git fetchwill now only fetch the refspec patterns configured on remotes
when the--bookmarkoption is omitted. Only simple refspec patterns are
currently supported, and anything else (like refspecs which rename branches)
will be ignored. -
The
conflictlabel used for coloring log graph nodes was renamed to
conflicted.
Deprecations
-
The on-disk index format has changed.
jjwill write index files in both old
and new formats, so oldjjversions should be able to read these index
files. This compatibility layer will be removed in a future release. -
jj op undois deprecated in favor ofjj op revert. (jj undois still
available, but with new semantics. See also the breaking changes above.) -
The argument
<operation>ofjj undois deprecated in favor of
jj op revert <operation>. -
The
--whatflag onjj undois deprecated. Consider using
jj op restore --whatinstead.
New features
-
The new command
jj redocan progressively redo operations that were
previously undone by multiple calls tojj undo. -
Templates now support
any()andall()methods on lists to check whether
any or all elements satisfy a predicate. Example:parents.any(|c| c.mine())
returns true if any parent commit is authored by the user. -
Add experimental support for indexing changed paths, which will speed up
jj log PATHquery,jj file annotate, etc. The changed-path index can be
enabled byjj debug index-changed-pathscommand. Indexing may take tens of
minutes depending on the number of merge commits. The indexing command UI is
subject to change. #4674 -
jj config listnow supports-T'json(self) ++ "\n"'serialization output. -
jj file shownow accepts-T/--templateoption to insert file metadata. -
The template language now allows arbitrary whitespace between any operators.
-
The new configuration option
git.colocate=booleancontrols whether or not
Git repositories are colocated by default. -
Both
jj git cloneandjj git initnow take a--no-colocateflag to
disable colocation (in casegit.colocateis set totrue.) -
jj git remote addandjj git clonenow support--fetch-tagsto control
when tags are fetched for all subsequent fetches. -
jj git fetchnow supports--trackedto fetch only tracked bookmarks. -
jj diff --statnow shows the change in size to binary files. -
jj interdiff,jj evolog -p, andjj op log -pnow show diff of commit
descriptions. -
jj logandjj op logoutput can now be anonymized with the
builtin_log_redactedandbuiltin_op_log_redactedtemplates. -
jj git initnow checks for anupstreamremote in addition tooriginwhen
setting the repository-leveltrunk()alias. Theupstreamremote takes
precedence overoriginif both exist. -
Add the
jj metaeditcommand, which modifies a revision's metadata. This can
be used to generate a new change-id, which may help resolve some divergences.
It also has options to modify author name, email and timestamp, as well as to
modify committer timestamp. -
Filesets now support case-insensitive glob patterns with the
glob-i:,
cwd-glob-i:, androot-glob-i:pattern kinds. For example,glob-i:"*.rs"
will match bothfile.rsandFILE.RS. -
jj op shownow accepts-T/--templateoption to customize the operation
output using template expressions, similar tojj op log. Also added
--no-op-diffflag to suppress the operation diff. -
A nearly identical string pattern system as revsets is now supported in the
template language, and is exposed asstring.match(pattern).
Fixed bugs
-
jj git clonenow correctly fetches all tags, unless--fetch-tagsis
explicitly specified, in which case the specified option will apply for both
the initial clone and subsequent fetches. -
Operation and working-copy state files are now synchronized to disk on save.
This will mitigate data corruption on system crash.
#4423
Packaging changes
- The test suite no longer optionally uses Taplo CLI or jq, and packagers can
remove them as dependencies if present.
Contributors
- Austin Seipp (@thoughtpolice)
- Benjamin Tan (@bnjmnt4n)
- Christian Hufnagel (@OvidiusCicero)
- Clément (@drawbu)
- Daniel Luz (@mernen)
- Emily (@emilazy)
- Evan Martin (@evmar)
- Gaëtan Lehmann (@glehmann)
- George Christou (@gechr)
- Graham Christensen (@grahamc)
- Hegui Dai (@Natural-selection1)
- Ian Wrzesinski (@isuffix)
- Ilya Grigoriev (@ilyagr)
- Isaac Corbrey (@icorbrey)
- Ivan Petkov (@ipetkov)
- Joaquín Triñanes (@JoaquinTrinanes)
- Kaiyi Li (@06393993)
- Martin von Zweigbergk (@martinvonz)
- Nigthknight (@nigthknight)
- Nikhil Marathe (@nikhilm)
- Remo Senekowitsch (@senekor)
- Tijs-B (@Tijs-B)
- Yuya Nishihara (@yuja)
v0.32.0
About
jj is a Git-compatible version control system that is both simple and powerful. See
the installation instructions to get started.
Breaking changes
-
In revsets, symbol expressions (such as change ID prefix) no longer resolve to
multiple revisions, and error out if resolved to more than one revisions. Use
change_id(prefix)orbookmarks(exact:name)to query divergent changes or
conflicted bookmarks. Commands likejj rebaseno longer requireall:to
specify multiple destination revisions. -
jj op abandonnow discards previous versions of a change (or predecessors)
if they become unreachable from the operation history. The evolution history
is truncated accordingly.Once
jj op abandonandjj util gcare run in a repository, old versions of
jjmight get "commit not found" error onjj evolog. -
commit.working_copies()template method now returnsList<WorkspaceRef> -
The previously predefined
amendalias has been removed. You can restore it
by setting the configaliases.amend = ["squash"].
Deprecations
-
The
all:revset modifier andui.always-allow-large-revsetssetting is
planned to be removed in a future release.
#6016 -
Rename the
core.fsmonitorandcore.watchmansettings to
fsmonitor.backend, andfsmonitor.watchmanrespectively.
New features
-
jj workspace listnow accepts-T/--templateoption to customize its
output via templates. -
Added
templates.workspace_listtemplate to customize the output of
jj workspace list. -
jj fixnow buffers the standard error stream from subprocesses and emits
the output from each all at once. The file name is printed before the output. -
jj statusnow collapses fully untracked directories into one line.
It still fully traverses them while snapshotting but they won't clutter up
the output with all of their contents. -
Add the
working-copy.eol-conversionconfig which is similar to the git
core.autocrlfconfig. A heuristics is used to detect if a file is a binary
file to prevent the EOL conversion from changing binary files unexpectedly. -
Add a
.parents()method to the
Operationtype in the templating
language. -
Merge tools config can now explicitly forbid using them as diff editors or
diff formatters. Built-in tools that do not function well as diff editing
tools or as diff formatters will now report an error when used as such. -
jj diffeditnow accepts filesets to edit only the specified paths. -
AnnotationLine objects in templates now have a
original_line_number() -> Integermethod. -
Commit templates now support
.files()to list all existing files at that
revision. -
Glob patterns now support
{foo,bar}syntax. There may be subtle behavior
changes as we use the globset library now. -
The new
bisect(x)revset function can help bisect a range of commits to
find when a bug was introduced. -
New
first_parent()andfirst_ancestors()revset functions which are
similar toparents()andancestors(), but only traverse the first parent
of each commit (similar to Git's--first-parentoption). -
New
signing.backends.ssh.revocation-listconfig for specifying a list of revoked
public keys for commit signature verification. -
jj fixcommands now replace$rootwith the workspace's root path. This is
useful for tools stored inside the workspace.
Fixed bugs
-
Fixed an error in
jj util gccaused by the empty blob being missing from
the Git store. #7062 -
jj op diff -pandjj op log -pnow show content diffs from the first
predecessor only. #7090 -
jj git fetchno longer showsNaN%progress when connecting to slow remotes.
#7155
Contributors
Thanks to the people who made this release happen!
- adamnemecek (@adamnemecek)
- Alexander Kobjolke (@jakalx)
- Apromixately (@Apromixately)
- Austin Seipp (@thoughtpolice)
- Bryce Berger (@bryceberger)
- Daniel Danner (@dnnr)
- Daniel Luz (@mernen)
- Evan Martin (@evmar)
- George Christou (@gechr)
- George Elliott-Hunter (@george-palmsens)
- Hubert Głuchowski (@afishhh)
- Ilya Grigoriev (@ilyagr)
- Jade Lovelace (@lf-)
- Jake Martin (@jake-m-commits)
- Jan Klass (@Kissaki)
- Joaquín Triñanes (@JoaquinTrinanes)
- Josh Steadmon (@steadmon)
- Kaiyi Li (@06393993)
- Martin von Zweigbergk (@martinvonz)
- Nigthknight (@nigthknight)
- Ori Avtalion (@salty-horse)
- Pablo Brasero (@pablobm)
- Pavan Kumar Sunkara (@pksunkara)
- Philip Metzger (@PhilipMetzger)
- phoebe (@phoreverpheebs)
- Remo Senekowitsch (@senekor)
- Scott Taylor (@scott2000)
- Stephen Jennings (@jennings)
- Theo Buehler (@botovq)
- Tyarel8 (@Tyarel8)
- Yuya Nishihara (@yuja)
v0.31.0
About
jj is a Git-compatible version control system that is both simple and powerful. See
the installation instructions to get started.
Breaking changes
-
Revset expressions like
hidden_id | description(x)now search the specified
hidden revision and its ancestors as well
as all visible revisions. -
Commit templates no longer normalize
descriptionby appending final newline
character. Usedescription.trim_end() ++ "\n"if needed.
Deprecations
- The
git.push-bookmark-prefixsetting is deprecated in favor of
templates.git_push_bookmark, which supports templating. The old setting can
be expressed in template as"<prefix>" ++ change_id.short().
New features
-
New
change_id(prefix)/commit_id(prefix)revset functions to explicitly
query commits by change/commit ID prefix. -
The
parents()andchildren()revset functions now accept an optional
depthargument. For instance,parents(x, 3)is equivalent tox---, and
children(x, 3)is equivalent tox+++. -
jj evologcan now follow changes from multiple revisions such as divergent
revisions. -
jj diffnow accepts-T/--templateoption to customize summary output. -
Log node templates are now specified in toml rather than hardcoded.
-
Templates now support
json(x)function to serialize values in JSON format. -
The ANSI 256-color palette can be used when configuring colors. For example,
colors."diff removed token" = { bg = "ansi-color-52", underline = false }
will apply a dark red background on removed words in diffs.
Fixed bugs
-
jj file annotatecan now process files at a hidden revision. -
jj op log --op-diffno longer fails at displaying "reconcile divergent
operations." #4465 -
jj util gc --expire=nownow passes the corresponding flag togit gc. -
change_id/commit_id.shortest()template functions now take conflicting
bookmark and tag names into account.
#2416 -
Fixed lockfile issue on stale file handles observed with NFS.
Packaging changes
aarch64-windowsbuilds (release binaries andmainsnapshots) are now provided.
Contributors
Thanks to the people who made this release happen!
- Anton Älgmyr (@algmyr)
- Austin Seipp (@thoughtpolice)
- Benjamin Brittain (@benbrittain)
- Cyril Plisko (@imp)
- Daniel Luz (@mernen)
- Gaëtan Lehmann (@glehmann)
- Gilad Woloch (@giladwo)
- Greg Morenz (@gmorenz)
- Igor Velkov (@iav)
- Ilya Grigoriev (@ilyagr)
- Jade Lovelace (@lf-)
- Jonas Greitemann (@jgreitemann)
- Josh Steadmon (@steadmon)
- juemrami (@juemrami)
- Kaiyi Li (@06393993)
- Lars Francke (@lfrancke)
- Martin von Zweigbergk (@martinvonz)
- Osama Qarem (@osamaqarem)
- Philip Metzger (@PhilipMetzger)
- raylu (@raylu)
- Scott Taylor (@scott2000)
- Vincent Ging Ho Yim (@cenviity)
- Yuya Nishihara (@yuja)
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)