v0.37.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
-
A new syntax for referring to hidden and divergent change IDs is available:
xyz/nwherenis a number. For instance,xyz/0refers to the latest version ofxyz, whilexyz/1refers to the previous version ofxyz. This allows you to perform actions likejj restore --from xyz/1 --to xyzto restorexyzto its previous contents, if you made a mistake.For divergent changes, the numeric suffix will always be shown in the log, allowing you to disambiguate them in a similar manner.
Breaking changes
-
String patterns in revsets, command arguments, and configuration are now parsed as globs by default. Use
substring:orexact:prefix as needed. -
remotes.<name>.auto-track-bookmarksis now parsed the same way they are in revsets and can be combined with logical operators. -
jj bookmark track/untracknow accepts--remoteargument. If omitted, all remote bookmarks matching the bookmark names will be tracked/untracked. The old<bookmark>@<remote>syntax is deprecated in favor of<bookmark> --remote=<remote>. -
On Windows, symlinks that point to a path with
/won't be supported. This path is invalid on Windows. -
The template alias
format_short_change_id_with_hidden_and_divergent_info(commit)has been replaced byformat_short_change_id_with_change_offset(commit). -
The following deprecated config options have been removed:
git.push-bookmark-prefixui.default-descriptionui.diff.formatui.diff.tool
-
The deprecated
commit_id.normal_hex()template method has been removed. -
Template expansion that did not produce a terminating newline will not be fixed up to provide one by
jj log,jj evolog, orjj op log. -
The
diffconflict marker style can now use\\\\\\\markers to indicate the continuation of a conflict label from the previous line.
Deprecations
- The
git_head()andgit_refs()functions will be removed from revsets and templates.git_head()should point to thefirst_parent(@)revision in colocated repositories.git_refs()can be approximated asremote_bookmarks(remote=glob:*) | tags().
New features
-
Updated the executable bit representation in the local working copy to allow ignoring executable bit changes on Unix. By default we try to detect the filesystem's behavior, but this can be overridden manually by setting
working-copy.exec-bit-change = "respect" | "ignore". -
jj workspace addnow also works for empty destination directories. -
jj git remotefamily of commands now supports different fetch and push URLs. -
[colors]table now supportsdim = trueattribute. -
In color-words diffs, context line numbers are now rendered with decreased intensity.
-
Hidden and divergent commits can now be unambiguously selected using their change ID combined with a numeric suffix. For instance, if there are two commits with change ID
xyz, then one can be referred to asxyz/0and the other can be referred to asxyz/1. These suffixes are shown in the log when necessary to make a change ID unambiguous. -
jj util gcnow prunes unreachable files in.jj/repo/store/extrato save disk space. -
Early version of a
jj file searchcommand for searching for a pattern in files (likegit grep). -
Conflict labels now contain information about where the sides of a conflict came from (e.g.
nlqwxzwn 7dd24e73 "first line of description"). -
--insert-beforenow accepts a revset that resolves to an empty set when used with--insert-after. The behavior is similar to--onto. -
jj tag listnow supports--sortoption. -
TreeDiffEntrytype now has adisplay_diff_path()method that formats renames/copies appropriately. -
TreeDiffEntrynow has astatus_char()method that returns single-character status codes (M/A/D/C/R). -
CommitEvolutionEntrytype now has apredecessors()method which returns the predecessor commits (previous versions) of the entry's commit. -
CommitEvolutionEntrytype now has ainter_diff()method which returns aTreeDiffbetween the entry's commit and its predecessor version. Optionally accepts a fileset literal to limit the diff.
Fixed bugs
-
Broken symlink on Windows. #6934.
-
Fixed failure on exporting moved/deleted annotated tags to Git. Moved tags are exported as lightweight tags.
-
jj gerrit uploadnow correctly handles mixed explicit and implicit Change-Ids in chains of commits (#8219) -
jj git pushnow updates partially-pushed remote bookmarks accordingly. #6787 -
Fixed problem of loading large Git packfiles. https://github.com/GitoxideLabs/gitoxide/issues/2265
-
The builtin pager won't get stuck when stdin is redirected.
-
jj workspace addnow prevents creating an empty workspace name. -
Fixed checkout of symlinks pointing to themselves or
.git/.jjon Unix. The problem would still remain on Windows if symlinks are enabled. #8348 -
Fixed a bug where jj would fail to read git delta objects from pack files. https://github.com/GitoxideLabs/gitoxide/issues/2344
Contributors
Thanks to the people who made this release happen!
- Anton Älgmyr (@algmyr)
- Austin Seipp (@thoughtpolice)
- Bryce Berger (@bryceberger)
- Carlos Knippschild (@chuim)
- Cole Helbling (@cole-h)
- David Higgs (@higgsd)
- Eekle (@Eekle)
- Gaëtan Lehmann (@glehmann)
- Ian Wrzesinski (@isuffix)
- Ilya Grigoriev (@ilyagr)
- Julian Howes (@jlnhws)
- Kaiyi Li (@06393993)
- Lukas Krejci (@metlos)
- Martin von Zweigbergk (@martinvonz)
- Matt Stark (@matts1)
- Ori Avtalion (@salty-horse)
- Scott Taylor (@scott2000)
- Shaoxuan (Max) Yuan (@ffyuanda)
- Stephen Jennings (@jennings)
- Steve Fink (@hotsphink)
- Steve Klabnik (@steveklabnik)
- Theo Buehler (@botovq)
- Thomas Castiglione (@gulbanana)
- Vincent Ging Ho Yim (@cenviity)
- xtqqczze (@xtqqczze)
- Yuantao Wang (@0WD0)
- Yuya Nishihara (@yuja)