4155 lines · 153.1 KB · Markdown
RawDownload

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]

Breaking changes

  • The deprecated flag --summary of jj abandon has been removed.

  • The deprecated command jj backout has been removed, use jj revert instead.

  • The following deprecated config options have been removed:

    • signing.sign-all
    • core.watchman.register_snapshot_trigger
    • diff.format

Deprecations

  • jj bisect run --command <cmd> is deprecated in favor of jj bisect run -- <cmd>.

  • jj metaedit --update-committer-timestamp was renamed to jj metaedit --force-rewrite since the old name (and help text) incorrectly suggested that the committer name and email would not be updated.

New features

  • Templates now support a .split(separator, [limit]) method on strings to split a string into a list of substrings.

  • -G is now available as a short form of --no-graph in jj log, jj evolog, jj op log, jj op show and jj op diff.

  • jj metaedit now accepts -m/--message option 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.

  • Workspaces may have an additional layered configuration, located at .jj/workspace-config.toml. jj config subcommands which took layer options like --repo now also support --workspace.

  • Add support for --when.workspaces config scopes.

  • jj bisect run accepts 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.

  • jj bookmark track can now associate new local bookmarks with remote. Tracked bookmarks can be pushed without --allow-new. #7072

  • New jj tag set/delete commands to create/update/delete tags locally. Updated tags will be exported to Git as lightweight tags.

  • New commit template keywords local/remote_tags to show only local/remote tags. These keywords may be useful in non-colocated Git repositories where local and exported @git tags can point to different revisions.

  • jj git clone now supports the --branch option to specify the branch(es) to fetch during clone. If present, the first matching branch is used as the working-copy parent.

  • The new jj git colocation command provides sub-commands to show the colocation state (status) and to convert a non-colocated git repo into a colocated repo (enable) and vice-versa disable.

Fixed bugs

  • jj metaedit --author-timestamp twice with the same value no longer edits the change twice in some cases.

  • jj squash: fixed improper revision rebase when both --insert-after and --insert-before were used.

  • jj undo can now revert "fetch"/"import" operation that involves tag updates. #6325

  • Fixed parsing of files(expr) revset expression including parentheses. #7747

  • Fixed jj describe --stdin to append a final newline character.

[0.34.0] - 2025-10-01

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 = false to keep the previous behavior.

  • Conflicts written by jj < 0.11 are no longer supported. They will now appear as regular files with a .jjconflict suffix and JSON contents.

  • The minimum supported Rust version (MSRV) is now 1.88.

Deprecations

  • Various flags on jj describe and jj commit have been deprecated in favor of jj metaedit. They are:

    • describe: --author, --reset-author, --no-edit
    • commit: --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 run uses binary search to find a commit that introduced a bug.

  • The default editor on Unix is now nano instead of pico.

  • 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.platforms to include settings only on certain platforms.

  • External diff commands now support substitution variable $width for the number of available terminal columns.

  • The new jj gerrit upload command allows you to upload given revisions to an instance of Gerrit Code Review.

  • jj bookmark create/set/move use the working copy as a default again and no longer require an explicit revision argument. This walks back a deprecation from jj 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 evaluate x and error if it does not have exactly n elements.

  • jj util exec now matches the exit status of the program it runs, and doesn't print anything.

  • jj config get now supports displaying array and table config values.

  • jj util exec sets the environment variable JJ_WORKSPACE_ROOT

Fixed bugs

  • Fetching repositories that have submodules no longer errors even if submodule.recurse=true is 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)

[0.33.0] - 2025-09-03

Release highlights

  • jj undo is now sequential: invoking it multiple times in sequence repeatedly undoes actions in the operation log. Previously, jj undo would only undo the most recent operation in the operation log. As a result, a new jj redo command has been added.

  • Experimental support for improving query performance over filesets and file queries (like jj log path/to/file.txt) has been added. This is not enabled by default. To enable this, you must use the jj debug index-changed-paths command.

Breaking changes

  • jj evolog templates now accept CommitEvolutionEntry as context type. To get Commit properties, use commit.<method>(). To customize the default output, set templates.evolog instead of templates.log.

  • jj op show now uses templates.op_show configuration for its default template instead of templates.op_log.

  • The deprecated config option git.auto-local-branch has been removed. Use git.auto-local-bookmark instead.

  • The deprecated Signature.username() template method has been removed. Use Signature.email().local() instead.

  • The deprecated --config-toml flag has been removed. Use --config=NAME=VALUE or --config-file=PATH instead.

  • jj undo can now undo multiple operations progressively by calling it repeatedly, whereas previously, running jj undo twice was previously a no-op (it only undid the last change).

  • jj git fetch will now only fetch the refspec patterns configured on remotes when the --bookmark option is omitted. Only simple refspec patterns are currently supported, and anything else (like refspecs which rename branches) will be ignored.

  • The conflict label used for coloring log graph nodes was renamed to conflicted.

Deprecations

  • The on-disk index format has changed. jj will write index files in both old and new formats, so old jj versions should be able to read these index files. This compatibility layer will be removed in a future release.

  • jj op undo is deprecated in favor of jj op revert. (jj undo is still available, but with new semantics. See also the breaking changes above.)

  • The argument <operation> of jj undo is deprecated in favor of jj op revert <operation>.

  • The --what flag on jj undo is deprecated. Consider using jj op restore --what instead.

New features

  • The new command jj redo can progressively redo operations that were previously undone by multiple calls to jj undo.

  • Templates now support any() and all() 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 PATH query, jj file annotate, etc. The changed-path index can be enabled by jj debug index-changed-paths command. Indexing may take tens of minutes depending on the number of merge commits. The indexing command UI is subject to change. #4674

  • jj config list now supports -T'json(self) ++ "\n"' serialization output.

  • jj file show now accepts -T/--template option to insert file metadata.

  • The template language now allows arbitrary whitespace between any operators.

  • The new configuration option git.colocate=boolean controls whether or not Git repositories are colocated by default.

  • Both jj git clone and jj git init now take a --no-colocate flag to disable colocation (in case git.colocate is set to true.)

  • jj git remote add and jj git clone now support --fetch-tags to control when tags are fetched for all subsequent fetches.

  • jj git fetch now supports --tracked to fetch only tracked bookmarks.

  • jj diff --stat now shows the change in size to binary files.

  • jj interdiff, jj evolog -p, and jj op log -p now show diff of commit descriptions.

  • jj log and jj op log output can now be anonymized with the builtin_log_redacted and builtin_op_log_redacted templates.

  • jj git init now checks for an upstream remote in addition to origin when setting the repository-level trunk() alias. The upstream remote takes precedence over origin if both exist.

  • Add the jj metaedit command, 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:, and root-glob-i: pattern kinds. For example, glob-i:"*.rs" will match both file.rs and FILE.RS.

  • jj op show now accepts -T/--template option to customize the operation output using template expressions, similar to jj op log. Also added --no-op-diff flag to suppress the operation diff.

  • A nearly identical string pattern system as revsets is now supported in the template language, and is exposed as string.match(pattern).

  • Merge tools can use the $path argument to learn where the file they are merging will end up in the repository.

Fixed bugs

  • jj git clone now correctly fetches all tags, unless --fetch-tags is 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)

[0.32.0] - 2025-08-06

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) or bookmarks(exact:name) to query divergent changes or conflicted bookmarks. Commands like jj rebase no longer require all: to specify multiple destination revisions.

  • jj op abandon now 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 abandon and jj util gc are run in a repository, old versions of jj might get "commit not found" error on jj evolog.

  • commit.working_copies() template method now returns List<WorkspaceRef>

  • The previously predefined amend alias has been removed. You can restore it by setting the config aliases.amend = ["squash"].

Deprecations

  • The all: revset modifier and ui.always-allow-large-revsets setting is planned to be removed in a future release. #6016

  • Rename the core.fsmonitor and core.watchman settings to fsmonitor.backend, and fsmonitor.watchman respectively.

New features

  • jj workspace list now accepts -T/--template option to customize its output via templates.

  • Added templates.workspace_list template to customize the output of jj workspace list.

  • jj fix now 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 status now 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-conversion config which is similar to the git core.autocrlf config. 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 Operation type 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 diffedit now accepts filesets to edit only the specified paths.

  • AnnotationLine objects in templates now have a original_line_number() -> Integer method.

  • 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() and first_ancestors() revset functions which are similar to parents() and ancestors(), but only traverse the first parent of each commit (similar to Git's --first-parent option).

  • New signing.backends.ssh.revocation-list config for specifying a list of revoked public keys for commit signature verification.

  • jj fix commands now replace $root with the workspace's root path. This is useful for tools stored inside the workspace.

Fixed bugs

  • Fixed an error in jj util gc caused by the empty blob being missing from the Git store. #7062

  • jj op diff -p and jj op log -p now show content diffs from the first predecessor only. #7090

  • jj git fetch no longer shows NaN% 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)

Lines 1–500 of 4155.