Skip to content

Releases: jj-vcs/jj

v0.36.0

04 Dec 06:42

Choose a tag to 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 documentation has moved from https://jj-vcs.github.io/jj/ to
    https://docs.jj-vcs.dev/.

    301 redirects are being issued towards the new domain, so any existing links
    should not be broken.

  • Fixed race condition that could cause divergent operations when running
    concurrent jj commands in colocated repositories. It is now safe to
    continuously run e.g. jj log without --ignore-working-copy in one
    terminal while you're running other commands in another terminal.
    #6830

  • jj now ignores $PAGER set in the environment and uses less -FRX on most
    platforms (:builtin on Windows). See the docs for
    more information, and #3502 for
    motivation.

Breaking changes

  • In filesets or path patterns, glob matching
    is enabled by default. You can use cwd:"path" to match literal paths.

  • In the following commands, string pattern
    arguments
    are now parsed the same way they
    are in revsets and can be combined with logical operators: jj bookmark delete/forget/list/move, jj tag delete/list, jj git clone/fetch/push

  • In the following commands, unmatched bookmark/tag names is no longer an
    error. A warning will be printed instead: jj bookmark delete/forget/move/track/untrack, jj tag delete, jj git clone/push

  • The default string pattern syntax in revsets will be changed to glob: in a
    future release. You can opt in to the new default by setting
    ui.revsets-use-glob-by-default=true.

  • Upgraded scm-record from v0.8.0 to v0.9.0. See release notes at
    https://github.com/arxanas/scm-record/releases/tag/v0.9.0.

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

  • On macOS, the deprecated config directory ~/Library/Application Support/jj
    is not read anymore. Use $XDG_CONFIG_HOME/jj instead (defaults to
    ~/.config/jj).

  • Sub-repos are no longer tracked. Any directory containing .jj or .git
    is ignored. Note that Git submodules are unaffected by this.

Deprecations

  • The --destination/-d arguments for jj rebase, jj split, jj revert,
    etc. were renamed to --onto/-o. The reasoning is that --onto,
    --insert-before, and --insert-after are all destination arguments, so
    calling one of them --destination was confusing and unclear. The old names
    will be removed at some point in the future, but we realize that they are
    deep in muscle memory, so you can expect an unusually long deprecation period.

  • jj describe --edit is deprecated in favor of --editor.

  • The config options git.auto-local-bookmark and git.push-new-bookmarks are
    deprecated in favor of remotes.<name>.auto-track-bookmarks. For example:

    [remotes.origin]
    auto-track-bookmarks = "glob:*"

    For more details, refer to
    the docs.

  • The flag --allow-new on jj git push is deprecated. In order to push new
    bookmarks, please track them with jj bookmark track. Alternatively, consider
    setting up an auto-tracking configuration to avoid the chore of tracking
    bookmarks manually. For example:

    [remotes.origin]
    auto-track-bookmarks = "glob:*"

    For more details, refer to
    the docs.

New features

  • jj commit, jj describe, jj squash, and jj split now accept
    --editor, which ensures an editor will be opened with the commit
    description even if one was provided via --message/-m.

  • All jj commands show a warning when the provided fileset expression
    doesn't match any files.

  • Added files() template function to DiffStats. This supports per-file stats
    like lines_added() and lines_removed()

  • Added join() template function. This is different from separate() in that
    it adds a separator between all arguments, even if empty.

  • RepoPath template type now has a absolute() -> String method that returns
    the absolute path as a string.

  • Added format_path(path) template that controls how file paths are printed
    with jj file list.

  • New built-in revset aliases visible() and hidden().

  • Unquoted * is now allowed in revsets. bookmarks(glob:foo*) no longer
    needs quoting.

  • jj prev/next --no-edit now generates an error if the working-copy has some
    children.

  • A new config option remotes.<name>.auto-track-bookmarks can be set to a
    string pattern. New bookmarks matching it will be automatically tracked for
    the specified remote. See
    the docs.

  • jj log now supports a --count flag to print the number of commits instead
    of displaying them.

Fixed bugs

  • jj fix now prints a warning if a tool failed to run on a file.
    #7971

  • Shell completion now works with non‑normalized paths, fixing the previous
    panic and allowing prefixes containing . or .. to be completed correctly.
    #6861

  • Shell completion now always uses forward slashes to complete paths, even on
    Windows. This renders completion results viable when using jj in Git Bash.
    #7024

  • Unexpected keyword arguments now return a parse failure for the coalesce()
    and concat() templating functions.

  • Nushell completion script documentation add -f option, to keep it up to
    date.
    #8007

  • Ensured that with Git submodules, remnants of your submodules do not show up
    in the working copy after running jj new.
    #4349

Contributors

Thanks to the people who made this release happen!

v0.35.0

06 Nov 03:07

Choose a tag to 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

  • Workspaces can now have their own separate configuration. For instance, you
    can use jj config set --workspace to update a configuration option only in
    the current workspace.

  • After creating a local bookmark, it is now possible to use jj bookmark track
    to associate the bookmark with a specific remote before pushing it. When
    pushing a tracked bookmark, it is not necessary to use --allow-new.

  • The new jj git colocation enable and jj git colocation disable commands
    allow converting between colocated and non-colocated workspaces.

Breaking changes

  • The remote_bookmarks(remote=pattern) revset now includes Git-tracking
    bookmarks if the specified pattern matches git. The default is
    remote=~exact:"git" as before.

  • 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

  • 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.

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

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

  • New jj tag set/delete commands to create/update/delete tags locally.
    Created/updated tags are currently always exported to Git as lightweight
    tags. If you would prefer them to be exported as annotated tags, please give
    us feedback on #7908.

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

  • -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.

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

  • Add support for --when.hostnames config scopes. This allows configuration to
    be conditionally applied based on the hostname set in operation.hostname.

  • 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.

  • 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.

  • Revsets now support logical operators in string patterns.

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.

Contributors

Thanks to the people who made this release happen!

v0.34.0

01 Oct 23:29

Choose a tag to 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

  • 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!

v0.33.0

04 Sep 04:48

Choose a tag to 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

  • 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).

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

v0.32.0

06 Aug 16:59

Choose a tag to 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

  • 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!

v0.31.0

02 Jul 20:09

Choose a tag to 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. Use description.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() and children() revset functions now accept an optional
    depth argument. For instance, parents(x, 3) is equivalent to x---, and
    children(x, 3) is equivalent to x+++.

  • 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 to git 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 and main snapshots) are now provided.

Contributors

Thanks to the people who made this release happen!

v0.30.0

04 Jun 14:17

Choose a tag to 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 called change-id), which means
    it will be transferred by regular git 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 the git.subprocess setting along with it.

  • In templates, bookmark/tag/remote names are now formatted in revset symbol
    notation. The type of bookmark.remote() is changed to Option<_>.
    bookmark.remote() == "foo" still works, but bookmark.remote().<method>()
    might need if(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 for jj rebase has been removed. Use the
    --skip-emptied flag instead.

  • The deprecated jj branch subcommands have been removed. Use the jj 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 setting merge-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 and ui.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 the CommitId template type.
    It's useful only for the ChangeId 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 on jj 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 on libgit2, libssh2, Zlib, OpenSSL, and pkg-config, and
    ensure they are not setting the Cargo git2 or vendored-openssl features.

Contributors

Thanks to the people who made this release happen!

v0.29.0

07 May 17:32

Choose a tag to 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
    setting git.write-change-id-header. If this is enabled, the change ID will be stored in the Git
    commit itself (in a commit header called change-id), which means it will be transferred by
    regular git 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 old libgit2
    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/or templates.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 and jj split add the
    commit trailers, configured in the commit_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 commits jj 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 unknown git.fetch remotes
    if other remotes are available.

  • Commit objects in templates now have trailers() -> List<Trailer>, the Trailer
    objects have key() -> String and value() -> 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 to first-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 the packaging Cargo feature.

Contributors

Thanks to the people who made this release happen!

v0.28.2

07 Apr 15:46

Choose a tag to compare

Fixed bugs

v0.28.1

05 Apr 04:18

Choose a tag to 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 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!