Changelog
All notable changes to this project will be documented in this file.
The format is based on Keep a Changelog, and this project adheres to Semantic Versioning.
[Unreleased]
Release highlights
Breaking changes
-
The minimum supported Rust version (MSRV) is now 1.84.0.
-
The
git.push-branch-prefixconfig has been removed in favor ofgit.push-bookmark-prefix. -
jj abandonno longer supports--summaryto suppress the list of abandoned commits. The list won't show more than 10 commits to not clutter the console. -
jj unsquashhas been removed in favor ofjj squashandjj diffedit --restore-descendants. -
The
jj untracksubcommand has been removed in favor ofjj file untrack. -
The following deprecated revset functions have been removed:
branches(),remote_branches(),tracked_remote_branches(), anduntracked_remote_branches(), which were renamed to "bookmarks".file()andconflict(), which were renamed to plural forms.files(x, y, ..)with multiple patterns. Usefiles(x|y|..)instead.
-
The following deprecated template functions have been removed:
branches(),local_branches(), andremote_branches(), which were renamed to "bookmarks".
-
The flags
--alland--trackedonjj git pushby themself do not cause deleted bookmarks to be pushed anymore, as an additional safety measure. They can now be combined with--deletedinstead.
Deprecations
-
core.watchman.register_snapshot_triggerhas been renamed tocore.watchman.register-snapshot-triggerfor consistency with other configuration options. -
jj backoutis deprecated in favor ofjj revert.
New features
-
jj signcan now sign with PKCS#12 certificates through thegpgsmbackend. -
jj signwill automatically use the gpg key associated with the author's email in the absence of asigning.keyconfiguration. -
Multiple user configs are now supported and are loaded in the following precedence order:
$HOME/.jjconfig.toml$XDG_CONFIG_HOME/jj/config.toml$XDG_CONFIG_HOME/jj/conf.d/*.toml
-
The
JJ_CONFIGenvironment variable can now contain multiple paths separated by a colon (or semicolon on Windows). -
The command
jj config listnow supports showing the origin of each variable via thebuiltin_config_list_detailedtemplate. -
jj config {edit,set,unset}now prompt when multiple config files are found. -
jj diff -rnow allows multiple revisions (as long as there are no gaps in the revset), such asjj diff -r 'mutable()'. -
jj git pushnow accepts a--named NAME=REVISIONargument to create a named bookmark and immediately push it. -
The 'how to resolve conflicts' hint that is shown when conflicts appear can be hidden by setting
hints.resolving-conflicts = false. -
jj op diffandjj op log --op-diffnow show changes to which commits correspond to working copies. -
jj op log -dis now an alias forjj op log --op-diff. -
jj bookmark move --to/--fromcan now be abbreviated tojj bookmark move -t/-f -
A new command
jj revertis added, which is similar tojj backoutbut adds the--destination,--insert-after, and--insert-beforeoptions to customize the location of reverted commits. -
A new command
jj git rootis added, which prints the location of the Git directory of a repository using the Git backend. -
In colocated repos, any files that jj considers added in the working copy will now show up in
git diff(as if you had rungit add --intent-to-addon them). -
Reversing colors is now supported. For example, to highlight words by reversing colors rather than underlining, you can set
colors."diff token"={ underline = false, reverse = true }in your config. -
Added
revsets.log-graph-prioritize, which can be used to configure which branch in thejj loggraph is displayed on the left instead of@(e.g.coalesce(description("megamerge\n"), trunk()))
Fixed bugs
-
jj log -p --statnow shows diff stats as well as the default color-words/git diff output. #5986 -
The built-in diff editor now correctly handles deleted files. #3702
-
The built-in diff editor now correctly retains the executable bit on newly added files when splitting. #3846
-
jj config set/--configvalue parsing rule is relaxed in a way that unquoted apostrophes are allowed. #5748
[0.27.0] - 2025-03-05
Release highlights
git.subprocessis now enabled by default, improving compatibility with Git fetches and pushes by spawning an externalgitprocess. Users can opt out of this by settinggit.subprocess = false, but this will likely be removed in a future release. Please report any issues you run into.
Breaking changes
-
Bookmark name to be created/updated is now parsed as a revset symbol. Quotation may be needed in addition to shell quotes. Example:
jj bookmark create -r@- "'name with space'" -
jj bookmark create,jj bookmark setandjj bookmark moveonto a hidden commit make it visible. -
jj bookmark forgetnow untracks any corresponding remote bookmarks instead of forgetting them, since forgetting a remote bookmark can be unintuitive. The old behavior is still available with the new--include-remotesflag. -
jj fixnow always sets the working directory of invoked tools to be the workspace root, instead of the working directory of thejj fix. -
The
ui.allow-filesetsconfiguration option has been removed. The "fileset" language has been enabled by default since v0.20. -
templates.annotate_commit_summaryis renamed totemplates.file_annotate, and now has an implicitselfparameter of typeAnnotationLine, instead ofCommit. All methods onCommitcan be accessed withcommit.method(), orself.commit().method().
Deprecations
-
This release takes the first steps to make target revision required in
bookmark create,bookmark moveandbookmark set. Those commands will display a warning if the user does not specify target revision explicitly. In the near future those commands will fail if target revision is not specified. -
The
signing.sign-allconfig option has been deprecated in favor ofsigning.behavior. The new option acceptsdrop(never sign),keep(preserve existing signatures),own(sign own commits), orforce(sign all commits). Existingsigning.sign-all = truetranslates tosigning.behavior = "own", andfalsetranslates to"keep". Invalid configuration is now an error.
New features
-
The new
jj signandjj unsigncommands allow for signing/unsigning commits.jj signsupports configuring the default revset throughrevsets.signwhen no--revisionsarguments are provided. -
jj git fetchnow supports string pattern syntax on--remoteoption andgit.fetchconfiguration. -
Template functions
truncate_start()andtruncate_end()gained an optionalellipsisparameter; passing this prepends or appends the ellipsis to the content if it is truncated to fit the maximum width. -
Templates now support
stringify(x)function and string method.escape_json(). The latter serializes the string in JSON format. It is useful for making machine-readable templates by escaping problematic characters like\n. -
Templates now support
trim(),trim_start()andtrim_end()methods which remove whitespace from the start and end of aStringtype. -
The description of commits backed out by
jj backoutcan now be configured usingtemplates.backout_description. -
New
AnnotationLinetemplater type. Used intemplates.file_annotate. Providesself.commit(),.content(),.line_number(), and.first_line_in_hunk(). -
Templates now have
format_short_operation_id(id)function for users to customize the default operation id representation. -
The
jj init/jj revertstubs that print errors can now be overridden with aliases. All ofjj clone/init/revertadd a hint to a generic error. -
Help text is now colored (when stdout is a terminal).
-
Commands that used to suggest
--ignore-immutablenow print the number of immutable commits that would be rewritten if used and a link to the docs. -
jj undonow shows a hint when undoing an undo operation that the user may be looking forjj op restoreinstead.
Fixed bugs
-
jj statusnow shows untracked files under untracked directories. #5389 -
Added workaround for the bug that untracked files are ignored when watchman is enabled. #5728
-
The
signing.backends.ssh.allowed-signersconfiguration option will now expand~/to$HOME/. #5626 -
config-schema.jsonnow allows arrays of strings for the settingsui.editorandui.diff.tool. -
config-schema.jsonnow allows an array of strings or nested table for theui.pagersetting.
Contributors
Thanks to the people who made this release happen!
- Alain Leufroy (@aleufroy)
- Aleksey Kuznetsov (@zummenix)
- Alexander Mikhailov (@AM5800)
- Andrew Gilbert (@andyg0808)
- Antoine Martin (@alarsyo)
- Anton Bulakh (@necauqua)
- Austin Seipp (@thoughtpolice)
- Baltasar Dinis (@bsdinis)
- Benjamin Tan (@bnjmnt4n)
- Bryce Berger (@bryceberger)
- Burak Varlı (@unexge)
- David Rieber (@drieber)
- Emily (@emilazy)
- Evan Mesterhazy (@emesterhazy)
- George Christou (@gechr)
- HKalbasi (@HKalbasi)
- Ilya Grigoriev (@ilyagr)
- Jacob Hayes (@JacobHayes)
- Jonathan Frere (@MrJohz)
- Jonathan Tan (@jonathantanmy)
- Josh Steadmon (@steadmon)
- maan2003 (@maan2003)
- Martin von Zweigbergk (@martinvonz)
- Matthew Davidson (@KingMob)
- Philip Metzger (@PhilipMetzger)
- Philipp Albrecht (@pylbrecht)
- Roman Timushev (@rtimush)
- Samuel Tardieu (@samueltardieu)
- Scott Taylor (@scott2000)
- Stephan Hügel (@urschrei)
- Vincent Ging Ho Yim (@cenviity)
- Yuya Nishihara (@yuja)
[0.26.0] - 2025-02-05
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 logandjj 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 asStringserialized 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 tolibgit2s 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_onelineandformat_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 viadiff.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 usingformat_detailed_cryptographic_signature(signature)andformat_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 clonetorevset-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)
[0.25.0] - 2025-01-01
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-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 listnow prints inline tables{ key = value, .. }literally.
Lines 1–500 of 3172. Load more
# Changelog All notable changes to this project will be documented in this file. The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/), and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html). ## [Unreleased] ### Release highlights ### 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 of `jj squash` and `jj diffedit --restore-descendants`. * The `jj untrack` subcommand has been removed in favor of `jj 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()` and `conflict()`, which were renamed to plural forms. - `files(x, y, ..)` with multiple patterns. Use `files(x|y|..)` instead. * The following deprecated template functions have been removed: - `branches()`, `local_branches()`, and `remote_branches()`, which were renamed to "bookmarks". * The flags `--all` and `--tracked` on `jj 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 to `core.watchman.register-snapshot-trigger` for consistency with other configuration options. * `jj backout` is deprecated in favor of `jj revert`. ### New features * `jj sign` can now sign with PKCS#12 certificates through the `gpgsm` backend. * `jj sign` will automatically use the gpg key associated with the author's email in the absence of a `signing.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 the `builtin_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 as `jj 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 setting `hints.resolving-conflicts = false`. * `jj op diff` and `jj op log --op-diff` now show changes to which commits correspond to working copies. * `jj op log -d` is now an alias for `jj op log --op-diff`. * `jj bookmark move --to/--from` can now be abbreviated to `jj bookmark move -t/-f` * A new command `jj revert` is added, which is similar to `jj 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 in `git diff` (as if you had run `git 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 the `jj log` graph is displayed on the left instead of `@` (e.g. `coalesce(description("megamerge\n"), trunk())`) ### Fixed bugs * `jj log -p --stat` now shows diff stats as well as the default color-words/git diff output. [#5986](https://github.com/jj-vcs/jj/issues/5986) * The built-in diff editor now correctly handles deleted files. [#3702](https://github.com/jj-vcs/jj/issues/3702) * The built-in diff editor now correctly retains the executable bit on newly added files when splitting. [#3846](https://github.com/jj-vcs/jj/issues/3846) * `jj config set`/`--config` value parsing rule is relaxed in a way that unquoted apostrophes are allowed. [#5748](https://github.com/jj-vcs/jj/issues/5748) ## [0.27.0] - 2025-03-05 ### Release highlights * `git.subprocess` is now enabled by default, improving compatibility with Git fetches and pushes by spawning an external `git` process. Users can opt out of this by setting `git.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](docs/revsets.md#symbols). Quotation may be needed in addition to shell quotes. Example: `jj bookmark create -r@- "'name with space'"` * `jj bookmark create`, `jj bookmark set` and `jj 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 the `jj fix`. * The `ui.allow-filesets` configuration option has been removed. [The "fileset" language](docs/filesets.md) has been enabled by default since v0.20. * `templates.annotate_commit_summary` is renamed to `templates.file_annotate`, and now has an implicit `self` parameter of type `AnnotationLine`, instead of `Commit`. All methods on `Commit` can be accessed with `commit.method()`, or `self.commit().method()`. ### Deprecations * This release takes the first steps to make target revision required in `bookmark create`, `bookmark move` and `bookmark 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 accepts `drop` (never sign), `keep` (preserve existing signatures), `own` (sign own commits), or `force` (sign all commits). Existing `signing.sign-all = true` translates to `signing.behavior = "own"`, and `false` translates to `"keep"`. Invalid configuration is now an error. ### New features * The new `jj sign` and `jj unsign` commands allow for signing/unsigning commits. `jj sign` supports configuring the default revset through `revsets.sign` when no `--revisions` arguments are provided. * `jj git fetch` now supports [string pattern syntax](docs/revsets.md#string-patterns) on `--remote` option and `git.fetch` configuration. * Template functions `truncate_start()` and `truncate_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()` and `trim_end()` methods which remove whitespace from the start and end of a `String` type. * The description of commits backed out by `jj backout` can now be configured using `templates.backout_description`. * New `AnnotationLine` templater type. Used in `templates.file_annotate`. Provides `self.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 of `jj 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 for `jj op restore` instead. ### Fixed bugs * `jj status` now shows untracked files under untracked directories. [#5389](https://github.com/jj-vcs/jj/issues/5389) * Added workaround for the bug that untracked files are ignored when watchman is enabled. [#5728](https://github.com/jj-vcs/jj/issues/5728) * The `signing.backends.ssh.allowed-signers` configuration option will now expand `~/` to `$HOME/`. [#5626](https://github.com/jj-vcs/jj/pull/5626) * `config-schema.json` now allows arrays of strings for the settings `ui.editor` and `ui.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) ## [0.26.0] - 2025-02-05 ### Release highlights * Improved Git push/fetch compatibility by spawning an external `git` process. This can be enabled by the `git.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 the `ui.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 on `jj git push --all`. [#3505](https://github.com/jj-vcs/jj/issues/3505) * `jj init --git` and `jj init --git-repo` have been removed. They were deprecated in early 2024. Use `jj git init` instead. * The following deprecated commands have been removed: - `jj cat` is replaced by `jj file show`. - `jj chmod` is replaced by `jj file chmod`. - `jj files` is replaced by `jj file list`. * The deprecated `-l` short alias for `--limit` in `jj log`, `jj op log` and `jj obslog` has been removed. The `-n` short alias can be used instead. * The deprecated `--siblings` options for `jj 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 to `jj resolve`. * `jj util mangen` is replaced with `jj util install-man-pages`, which can install man pages for all `jj` subcommands to a given path. * In `jj config list` template, `value` is now typed as `ConfigValue`, 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 by `jj log .. | head`. [#5403](https://github.com/jj-vcs/jj/issues/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](https://github.com/markbt/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 external `git` subprocess, via the `git.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](https://github.com/jj-vcs/jj/issues/4979). * `jj describe` now accepts `--edit`. * `jj evolog` and `jj 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 to `jj op log -T` for a more compact output. You can use `format_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 the `ui.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](https://github.com/jj-vcs/jj/issues/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 to `jj restore`, similarly to `jj squash` and `jj 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](/docs/config.md#json-schema-support) 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](https://github.com/jj-vcs/jj/issues/5252) * Conditional configuration now applies when initializing new repository. [#5144](https://github.com/jj-vcs/jj/issues/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](https://github.com/jj-vcs/jj/issues/3968) * Bookmark and remote names written by `jj git clone` to `revset-aliases.'trunk()'` are now escaped if necessary. [#5359](https://github.com/jj-vcs/jj/issues/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) ## [0.25.0] - 2025-01-01 ### 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](docs/config.md#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 `"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.