CARVIEW |
Navigation Menu
-
Notifications
You must be signed in to change notification settings - Fork 593
Releases: jj-vcs/jj
v0.31.0
Compare
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
description
by appending final newline
character. Usedescription.trim_end() ++ "\n"
if needed.
Deprecations
- The
git.push-bookmark-prefix
setting 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
depth
argument. For instance,parents(x, 3)
is equivalent tox---
, and
children(x, 3)
is equivalent tox+++
. -
jj evolog
can now follow changes from multiple revisions such as divergent
revisions. -
jj diff
now accepts-T
/--template
option 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 annotate
can now process files at a hidden revision. -
jj op log --op-diff
no longer fails at displaying "reconcile divergent
operations." #4465 -
jj util gc --expire=now
now 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-windows
builds (release binaries andmain
snapshots) 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)
Assets 9
v0.30.0
Compare
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 push
etc. 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 rebase
now automatically abandons divergent commits if another commit
with the same change ID is already present in the destination with identical
changes. -
jj split
has gained--message
,--insert-before
,--insert-after
, and
--destination
options. -
jj evolog
can show associated operations for commits created by new jj
versions.
Breaking changes
-
The old
libgit2
code path for fetches and pushes has been removed,
and thegit.subprocess
setting 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 rebase
now 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-divergent
flag. -
The deprecated
--skip-empty
flag forjj rebase
has been removed. Use the
--skip-emptied
flag instead. -
The deprecated
jj branch
subcommands have been removed. Use thejj bookmark
subcommands instead. -
jj util completion
now 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.format
andui.diff.tool
config 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 theCommitId
template type.
It's useful only for theChangeId
type.
New features
-
jj split
has gained a--message
option to set the description of the
commit with the selected changes. -
jj split
has gained the ability to place the revision with the selected
changes anywhere in the revision tree with the--insert-before
,
--insert-after
and--destination
command line flags. -
Added
git.track-default-bookmark-on-clone
setting 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 evolog
can 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.fsmonitor
gitconfig is set in the global or system gitconfigs.
#6440 -
jj parallelize
can now parallelize groups of changes that start with an
immutable change, but do not contain any other immutable changes. -
jj
will 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
libgit2
code path, packagers should remove any
dependencies onlibgit2
,libssh2
, Zlib, OpenSSL, andpkg-config
, and
ensure they are not setting the Cargogit2
orvendored-openssl
features.
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)
Assets 8
v0.29.0
Compare
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 push
etc. 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
/--change
no longer moves existing local bookmarks. -
The
editor-*.jjdescription
files 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 = false
has 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-description
has 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/jj
are
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 show
patches can now be suppressed with--no-patch
. -
Added
ui.bookmark-list-sort-keys
setting to configure default sort keys for the
jj bookmark list
command. -
New
signed
revset function to filter for cryptographically signed commits. -
jj describe
,jj commit
,jj new
,jj squash
andjj split
add the
commit trailers, configured in thecommit_trailers
template, to the commit
description. Use cases include DCO Sign Off and Gerrit Change Id. -
Added
duplicate_description
template, which allows customizing the descriptions
of the commitsjj duplicate
creates. -
jj absorb
can now squash a deleted file if it was added by one of the
destination revisions. -
Added
ui.streampager.show-ruler
setting to configure whether the ruler should be
shown when the builtin pager starts up. -
jj git fetch
now warns instead of erroring for unknowngit.fetch
remotes
if other remotes are available. -
Commit objects in templates now have
trailers() -> List<Trailer>
, the Trailer
objects havekey() -> String
andvalue() -> String
. -
jj config edit
will 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..sec
and 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 thepackaging
Cargo 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)
Assets 8
v0.28.2
Compare
Fixed bugs
- Fixed problem that old commits could be re-imported from Git.
GitoxideLabs/gitoxide#1928
Assets 8
v0.28.1
Compare
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
:ours
and:theirs
merge 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)
Assets 8
v0.28.0
Compare
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 resolve
now accepts built-in tools:ours
and: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-prefix
config has been removed in favor of
git.push-bookmark-prefix
. -
jj abandon
no longer supports--summary
to suppress the list of abandoned
commits. The list won't show more than 10 commits to not clutter the console. -
jj unsquash
has been removed in favor ofjj squash
and
jj diffedit --restore-descendants
. -
The
jj untrack
subcommand 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
--all
and--tracked
onjj git push
by themself do not cause
deleted bookmarks to be pushed anymore, as an additional safety measure. They
can now be combined with--deleted
instead.
Deprecations
-
core.watchman.register_snapshot_trigger
has been renamed tocore.watchman.register-snapshot-trigger
for consistency with other configuration options. -
jj backout
is deprecated in favor ofjj revert
.
New features
-
jj sign
can now sign with PKCS#12 certificates through thegpgsm
backend. -
jj sign
will automatically use the gpg key associated with the author's email
in the absence of asigning.key
configuration. -
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_CONFIG
environment variable can now contain multiple paths separated
by a colon (or semicolon on Windows). -
The command
jj config list
now supports showing the origin of each variable
via thebuiltin_config_list_detailed
template. -
jj config {edit,set,unset}
now prompt when multiple config files are found. -
jj diff -r
now allows multiple revisions (as long as there are no gaps in
the revset), such asjj diff -r 'mutable()'
. -
jj git push
now accepts a--named NAME=REVISION
argument 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 diff
andjj op log --op-diff
now show changes to which commits
correspond to working copies. -
jj op log -d
is now an alias forjj op log --op-diff
. -
jj bookmark move --to/--from
can now be abbreviated tojj bookmark move -t/-f
-
jj bookmark list
now supports--sort
option. Similar togit branch --sort
.
Seejj bookmark list --help
for more details. -
A new command
jj revert
is added, which is similar tojj backout
but
adds the--destination
,--insert-after
, and--insert-before
options to
customize the location of reverted commits. -
A new command
jj git root
is 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-add
on
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 log
graph is displayed on the left instead of@
(e.g.coalesce(description("megamerge\n"), trunk())
) -
jj resolve
now accepts new built-in merge tools:ours
and:theirs
.
These merge tools accept side #1 and side #2 of the conflict respectively.
Fixed bugs
-
jj log -p --stat
now 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
/--config
value parsing rule is relaxed in a way that
unquoted apostrophes are allowed.
#5748 -
jj fix
could 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)
Assets 8
v0.27.0
Compare
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.subprocess
is now enabled by default, improving compatibility with Git
fetches and pushes by spawning an externalgit
process. 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 set
andjj bookmark move
onto a hidden
commit make it visible. -
jj bookmark forget
now 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-remotes
flag. -
jj fix
now always sets the working directory of invoked tools to be the
workspace root, instead of the working directory of thejj fix
. -
The
ui.allow-filesets
configuration option has been removed.
The "fileset" language has been enabled by default since v0.20. -
templates.annotate_commit_summary
is renamed totemplates.file_annotate
,
and now has an implicitself
parameter of typeAnnotationLine
, instead of
Commit
. All methods onCommit
can be accessed withcommit.method()
, or
self.commit().method()
.
Deprecations
-
This release takes the first steps to make target revision required in
bookmark create
,bookmark move
andbookmark 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-all
config 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 = true
translates tosigning.behavior = "own"
, and
false
translates to"keep"
. Invalid configuration is now an error.
New features
-
The new
jj sign
andjj unsign
commands allow for signing/unsigning commits.
jj sign
supports configuring the default revset throughrevsets.sign
when
no--revisions
arguments are provided. -
jj git fetch
now supports string pattern syntax
on--remote
option andgit.fetch
configuration. -
Template functions
truncate_start()
andtruncate_end()
gained an optional
ellipsis
parameter; 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 aString
type. -
The description of commits backed out by
jj backout
can now be configured
usingtemplates.backout_description
. -
New
AnnotationLine
templater 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 revert
stubs that print errors can now be overridden with
aliases. All ofjj clone/init/revert
add a hint to a generic error. -
Help text is now colored (when stdout is a terminal).
-
Commands that used to suggest
--ignore-immutable
now print the number of
immutable commits that would be rewritten if used and a link to the docs. -
jj undo
now shows a hint when undoing an undo operation that the user may
be looking forjj op restore
instead.
Fixed bugs
-
jj status
now 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-signers
configuration option will now
expand~/
to$HOME/
.
#5626 -
config-schema.json
now allows arrays of strings for the settingsui.editor
andui.diff.tool
. -
config-schema.json
now allows an array of strings or nested table for the
ui.pager
setting.
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)
Assets 8
v0.26.0
Compare
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
git
process.
This can be enabled by thegit.subprocess=true
config knob, and will be the
default in a future release. -
jj log
can now show cryptographic commit signatures. The output can be
controlled by theui.show-cryptographic-signatures=true
config knob.
Breaking changes
-
jj abandon
now deletes bookmarks pointing to the revisions to be abandoned.
Use--retain-bookmarks
to 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 --git
andjj init --git-repo
have been removed. They were
deprecated in early 2024. Usejj git init
instead. -
The following deprecated commands have been removed:
jj cat
is replaced byjj file show
.jj chmod
is replaced byjj file chmod
.jj files
is replaced byjj file list
.
-
The deprecated
-l
short alias for--limit
injj log
,jj op log
andjj obslog
has been removed. The-n
short alias can be used instead. -
The deprecated
--siblings
options forjj split
has been removed.
jj split --parallel
can be used instead. -
The deprecated
fix.tool-command
config 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 list
now prints inline tables{ key = value, .. }
literally.
Inner items of inline tables are no longer merged across configuration
files.
-
jj resolve
will 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 mangen
is replaced withjj util install-man-pages
, which can
install man pages for alljj
subcommands to a given path. -
In
jj config list
template,value
is now typed asConfigValue
, not as
String
serialized in TOML syntax. -
jj git remote add
/set-url
now converts relative Git remote path to
absolute path. -
jj log
/op log
now applies-n
/--limit
before 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-record
from 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.0
may 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 externalgit
subprocess, via
thegit.subprocess = true
config knob. This provides an alternative that,
when turned on, fixes SSH bugs when interacting with Git remotes due to
libgit2
s limitations #4979. -
jj describe
now accepts--edit
. -
jj evolog
andjj op log
now accept--reversed
. -
jj restore
now supports-i
/--interactive
selection. -
jj file list
now supports templating. -
There is a new
builtin_op_log_oneline
template alias you can pass tojj op log -T
for a more compact output. You can useformat_operation_oneline
and
format_snapshot_operation_oneline
to 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
diff
commit 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 log
can now show cryptographic commit signatures. The output can be
controlled by theui.show-cryptographic-signatures=true
config knob. The
signature template can be customized using
format_detailed_cryptographic_signature(signature)
and
format_short_cryptographic_signature(signature)
. -
New
git.sign-on-push
config option to automatically sign commits which are
being pushed to a Git remote. -
New
git.push-new-bookmarks
config option to push new bookmarks without
--allow-new
. -
jj status
now 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-codes
config option to suppress
warnings from tools exiting with non-zero exit codes. -
New
fix.tools.TOOL.enabled
config 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
--into
flag tojj restore
, similarly tojj squash
andjj absorb
. It is equivalent to--to
, but--into
is 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.commands
to 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 fetch
with 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 clone
to
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)
Assets 8
v0.25.0
Compare
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,
true
is
not converted to a string"carview.php?tsp=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-prefixes
signing.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 list
now 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 --user
now opens a file even if$JJ_CONFIG
points to a
directory. If there are multiple config files, the command will fail. -
jj config set
no 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 absorb
now abandons the source commit if it becomes empty and has no
description.
Deprecations
-
--config-toml=TOML
is deprecated in favor of--config=NAME=VALUE
and
--config-file=PATH
. -
The
Signature.username()
template method is deprecated for
Signature().email().local()
.
New features
-
jj
command no longer fails due to new working-copy files larger than the
snapshot.max-new-file-size
config option. It will print a warning and large
files will be left untracked. -
Configuration files now support conditional variables.
-
New command options
--config=NAME=VALUE
and--config-file=PATH
to set
string value without quoting and to load additional configuration from files. -
Templates now support the
>=
,>
,<=
, and<
relational operators for
Integer
types. -
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_length
variable to allow merge tools to support longer conflict
markers (equivalent to "%L" for Git merge drivers). -
jj describe
now accepts aJJ: ignore-rest
line that ignores everything
below it, similar to a "scissor line" in git. When editing multiple commits,
only ignore until the nextJJ: describe
line.
Fixed bugs
-
The
$NO_COLOR
environment 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 --user
no 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 clone
now converts local Git remote path to
slash-separated path. -
jj resolve
no 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)
Assets 8
v0.24.0
Compare
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 absorb
command automatically squashes changes from the current commit into relevant ancestor commits. -
Experimental dynamic shell completions have been added; see the docs for configuration.
-
jj duplicate
now accepts--destination
/--insert-before
/--insert-after
. -
Some deprecated commands have been removed (
jj move
,jj checkout
,jj merge
).
Breaking changes
-
jj move
has been removed. It was deprecated in 0.16.0. -
jj checkout
and the built-in aliasjj co
have been removed.
It was deprecated in 0.14.0. -
jj merge
has been removed. It was deprecated in 0.14.0. -
jj git push
no longer pushes new bookmarks by default. Use--allow-new
to
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
, andString
types. -
New command
jj absorb
that moves changes to stack of mutable revisions. -
New command
jj util exec
that can be used for arbitrary aliases. -
jj rebase -b
can now be used with the--insert-after
and--insert-before
options, likejj rebase -r
andjj 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-stale
for automatically
runningjj workspace update-stale
when applicable. -
jj duplicate
now accepts--destination
,--insert-after
and
--insert-before
options to customize the location of the duplicated
revisions. -
jj log
now 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 optionalpattern
argument,
mirroring that ofbookmarks()
. -
Several commands now support
-f/-t
shorthands for--from/--to
:diff
diffedit
interdiff
op diff
restore
-
New
ui.conflict-marker-style
config 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-style
config option to override the
conflict marker style used for a specific merge tool. -
New
merge-tools.<TOOL>.merge-conflict-exit-codes
config option to allow a
merge tool to exit with a non-zero code to indicate that not all conflicts
were resolved. -
jj simplify-parents
now supports configuring the default revset when no
--source
or--revisions
arguments are provided with the
revsets.simplify-parents
config.
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)