这是indexloc提供的服务,不要输入任何密码
Skip to content

Releases: jj-vcs/jj

v0.31.0

02 Jul 20:09
Compare
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
Compare
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
Compare
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
Compare
Choose a tag to compare

Fixed bugs

v0.28.1

05 Apr 04:18
Compare
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!

v0.28.0

03 Apr 02:23
Compare
Choose a tag to 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 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

  • jj bookmark list now supports --sort option. Similar to git branch --sort.
    See jj bookmark list --help for more details.

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

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

v0.27.0

06 Mar 00:11
Compare
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

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

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

v0.26.0

06 Feb 03:11
Compare
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

  • 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

  • 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

  • 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 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
    libgit2s limitations #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

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

v0.25.0

02 Jan 04:01
Compare
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

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 "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 as jj 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 a JJ: ignore-rest line that ignores everything
    below it, similar to a "scissor line" in git. When editing multiple commits,
    only ignore until the next JJ: 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!

v0.24.0

04 Dec 20:47
Compare
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

  • 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 alias jj 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 for Boolean,
    Integer, and String 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, like jj rebase -r and jj 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
    running jj 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 optional pattern argument,
    mirroring that of bookmarks().

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