Skip to content

Releases: jj-vcs/jj

v0.44.0

Choose a tag to compare

@martinvonz martinvonz released this 06 Aug 01:42

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 fetching and pushing tags has now been stabilized. Tags can be
    tracked or untracked just like bookmarks. Tracked tags are pushed by default.

Breaking changes

  • jj git fetch now fetches tags the same way it fetches bookmarks. Tags are
    fetched as <name>@<remote>, and these remote tags are automatically tracked
    by local tags of the same name. Running jj git fetch in an existing
    repository will re-fetch all tags to initialize the tracking state.

    Git's tagOpt is no longer respected. To disable tag fetching, set
    remotes.<name>.fetch-tags = '~*' in the jj configuration.

  • jj git clone --fetch-tags=all|none|included is removed in favor of
    --tag=PATTERN.

  • jj git push --all now pushes all tags in addition to bookmarks.

  • The WorkspaceRef.root() and RepoPath.absolute() template functions now
    return Option<FsPath> and FsPath respectively, instead of String. The
    path keyword in jj config list templates now returns Option<FsPath>.

  • jj file search now prints every matched line prefixed by the file path,
    instead of only the file paths of files containing a match. Use
    --name-only for the previous behavior.
    #9399

  • Passing an argument more than once is no longer an error. The last occurrence
    wins, so jj --no-pager --no-pager version and jj log -n 5 -n 10 now work,
    and an argument baked into an alias or a wrapper can be given explicitly as
    well. Arguments that can be specified multiple times, such as --config and
    jj log -r, are unaffected and still collect all of their values.
    #8101
    #9859

Deprecations

None

New features

  • New merge_point() revset function which (similar to fork_point) finds the
    point where multiple branches merge.

  • jj workspace list now shows workspace roots by default. The output can be
    customized with templates.workspace_list or -T, and WorkspaceRef.root()
    returns an optional FsPath value.
    #9713,
    #9826

  • New try(expr, fallback...) template function to suppress runtime errors.

  • jj run now processes revisions from oldest to newest by default. The start
    order is guaranteed: each revision begins execution only after the previous
    one has started, even with --jobs higher than 1.

  • jj run gained a --passthrough flag that connects the subprocess's
    stdout/stderr directly to the terminal instead of capturing output.

  • jj run gained a --ignore-changes flag to avoid editing any revisions even
    if the command modifies the working copy.

  • jj run gained a --ignore-errors flag to continue running against the
    remaining revisions even if the command exits with a nonzero exit code.

  • jj file search now supports -n/--line-number to prefix each match with
    its 1-based line number within the file.

  • jj git push gained a --allow-conflicts flag to allow pushing commits
    containing conflicts.

  • New jj tag track/untrack commands to associate local tags with remotes.
    Note that fetched tags are tracked by default.

  • Added builtin_log() revset alias for the built-in default jj log revset.
    revsets.log now defaults to builtin_log(), so custom log revsets can
    reuse the built-in default instead of copying its full expression.

  • Added config option diff.stat.max-bar-width for use with --stat to limit
    the ++-- bar width. In the templating language, diff.stat() can optionally
    take a second (positional or named) argument max_bar_width for an equivalent
    effect.

  • jj absorb now supports --interactive/-i/--tool to let you
    interactively choose which hunks from the source to consider for absorption.
    This is useful when you only want to absorb part of a commit without first
    splitting it. Any hunks that are not selected or cannot be absorbed remain in
    the source commit.

Fixed bugs

  • Recursive alias definitions are detected more precisely. jj can now expand
    aliases that are simply repeated. For example, with the alias jj = [], the
    command jj jj jj will resolve to jj. Aliases can also fall back to the
    default command. For example, with the alias i = ["--ignore-working-copy"],
    jj i will resolve to jj --ignore-working-copy.

  • Git temporary files are now cleaned up more reliably in the presence of
    signals (e.g. Ctrl-C). This should reduce the rate of "Could not acquire
    lock for index file" errors.
    (#7530)

  • Fixed Git HEAD mismatch after the working copy became immutable.
    #9827

  • jj now creates a new working-copy revision as soon as the one of the current
    workspace becomes immutable, as well as during snapshotting. This brings the
    behavior closer to jj 0.42 and earlier.

  • Snapshotting no longer fails if the working copy contains a path whose name
    isn't valid UTF-8. Such paths can't be tracked, so they are now skipped and
    reported as a warning instead.
    #9774

  • Fixed failure when reading configuration in copied repo with an empty
    repo-level configuration directory.

  • jj diff and jj status no longer omit a rename or copy in a merge commit
    when the renamed source is present in more than one parent. The identical copy
    record reported for each parent was mistaken for a conflict and discarded.
    #9752

  • jj run no longer panics when its revset includes a conflicted commit. The
    conflict is now preserved in the rewritten commit.
    #9747

  • Fixed a panic when passing overly-large length parameters to ID templater
    functions (commit_id.short(), commit_id.shortest(), etc.).
    #9833

  • jj git import and export in colocated workspaces are now disabled by
    default. These commands usually do nothing, but they had a race condition.

Contributors

Thanks to the people who made this release happen!

v0.43.0

Choose a tag to compare

@yuja yuja released this 02 Jul 01:41

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 run allows you to run a command over a set of changes, each with their
    own private working copy; the commands may update the working copy and
    changes/conflicts are propagated accordingly, e.g., jj run -- cargo check --all-features or jj run -- cargo fix behaves as one might expect.

Breaking changes

  • The deprecated git_head() and git_refs() functions have been removed from
    revsets and templates.

  • Git-like symbols (e.g. refs/heads/main) are no longer resolved to
    revisions. Use the bookmark/tag <name> or <name>@<remote> syntax instead.

  • The deprecated ui.revsets-use-glob-by-default option has been removed.

  • jj bookmark track/untrack no longer supports <kind>:<bookmark>@<remote>
    patterns. However, the <bookmark>@<remote> symbol syntax is still supported.
    #9226

Deprecations

New features

  • jj show now supports --reversed flag.

  • jj now looks for config files in /etc/jj.

  • jj config gc will delete configuration of deleted/moved repos from
    ~/.config/jj/repos folder.
    #9362

  • jj run allows you to run a command over a set of changes, each with their
    own private working copy; the commands may update the working copy and
    changes/conflicts are propagated accordingly, e.g., jj run -- cargo check --all-features or jj run -- cargo fix behaves as one might expect.

  • jj gerrit upload now supports the -o (--option) flag, which works like
    git push -o (--push-option).

  • jj git fetch now rebases the descendants of revisions that were rewritten
    based on their change IDs. Previously, when multiple bookmarked revisions
    existed in a stack, those rewritten revisions and their descendants wouldn't
    always be rebased. Note that immutable descendants will not be rebased.

  • Add a forks() revset function that yields all commits with more than 1 child.

  • colors config now supports crossed-out text styling with
    { crossed-out = true }.

Fixed bugs

  • On Windows, querying a path's file identity no longer follows symbolic links,
    matching the behavior on Unix. Previously a symlink shared the identity of its
    target, so two symlinks pointing at the same target were treated as the same
    file. This identity check is used when writing the working copy to detect
    aliases of the reserved .git and .jj directories.
    #8924

  • jj now creates a new working-copy revision during snapshotting if the
    working copy was immutable. Previously, the new revision was created
    immediately after the working copy became immutable.
    #7751
    #9338

  • jj git remote add now warns if the new remote exactly matches an existing
    remote's fetch URL or effective push URL.
    #413

  • Fixed corrupt loose Git objects on Intel Raptor Lake CPU and aarch64.
    Previously, jj could report a successful commit even though git fsck would
    later fail with incorrect data check, corrupt loose object, or missing blob, and later jj operations could fail with corrupt deflate stream.

Contributors

Thanks to the people who made this release happen!

v0.42.0

Choose a tag to compare

@martinvonz martinvonz released this 04 Jun 15:32

About

jj is a Git-compatible version control system that is both simple and powerful. See
the installation instructions to get started.

Release highlights

  • Switched to the mimalloc memory allocator for better multi-threaded
    performance.

Breaking changes

  • The following deprecated command options have been removed:

    • jj commit --reset-author/--author
    • jj describe --no-edit/--edit/--reset-author/--author
    • jj git push --allow-new
    • jj metaedit --update-committer-timestamp
  • The following deprecated config options have been removed:

    • git.auto-local-bookmark
    • git.push-new-bookmarks

Deprecations

  • jj evolog no longer supports legacy commit predecessors recorded in jj <
    0.30.

New features

  • Shell completions now surface descriptions for custom aliases,
    revset-aliases, template-aliases, and fileset-aliases. Descriptions are
    extracted from the .doc field of the alias definition if it is a table
    with .doc and .definition properties.

  • jj show now accepts multiple revisions, showing all of them one after the
    other, behaving closer to git show.

  • jj git fetch now generates evolution history based on change IDs. If change
    IDs are preserved by the remote, local descendant revisions will be rebased
    onto the rewritten parents.

  • Added jj util backend name command that prints the commit backend being used
    in the current repo.

  • Added edit-invocation-mode config option for diff editors (e.g.
    jj diffedit, jj split). When set to "file-by-file", the editor is
    launched once per changed file, making it possible to use per-file tools like
    vimdiff for editing.

Fixed bugs

  • jj git remote add now reports an error instead of panicking when the
    remote name is empty or contains whitespace.
    #9099

  • Color-words diffs are now shown as separate before and after lines when color
    output is disabled, making piped or redirected diffs readable.
    #5894

  • jj bookmark forget no longer prints Forgot N local bookmarks. when no
    local bookmarks were actually forgotten (e.g. when only an untracked remote
    bookmark matched). #9181.

  • The builtin_log_redacted template now also redacts workspace names.

Contributors

Thanks to the people who made this release happen!

v0.41.0

Choose a tag to compare

@martinvonz martinvonz released this 07 May 12:36

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 fix now supports formatting specific line ranges (allowing you to format
    only modified lines); see the configuration manual and notes below for more.

  • The new global flag --no-integrate-operation will let you run a command without
    impacting the repo state or the working copy, which is useful when automated tools
    may create snapshots in the background.

Breaking changes

  • The --pattern flag for file search now defaults to regex: instead of glob:.

  • jj git push --all/--tracked/-r REVSETS no longer fails when revisions to
    push are private or have conflicts. Bookmarks which aren't eligible to push
    will be skipped.

  • Branch/bookmark patterns passed to jj git clone are now saved to jj's repo
    settings file instead of .git/config. Git fetch refspecs are set to the
    default value.

Deprecations

  • In the templating language, the Operation type's .tags() function has been
    deprecated in favor of .attributes().

New features

  • The --pattern flag for file search now accepts various pattern kinds through
    kind:pattern syntax.

  • A new global flag --no-integrate-operation lets you run a command without
    impacting the repo state or the working copy.

  • A new config option diff.git.show-path-prefix can be used to suppress the
    a/ and b/ path prefixes in the diff --git output.

  • jj fix now supports line range-limited formatting via the fix.tools.<name>.line-range-arg
    and run-tool-if-zero-line-ranges configs. This allows running tools only on modified
    lines and fine-grained control over when the tool is run. If you have set the line-range-arg
    config, use --all-lines to match the previous behavior of formatting the entire file.

  • A new replace(pattern, content, replacement) template function is added
    which supports replacement of content in templates, using a lambda to format
    replacement text. It supports all string patterns, including regexes with
    capture groups (e.g. replace(regex:'(\w+) (\w+)', "hello world", |c| c.get(1) ++ " " ++ c.get(2))).

  • New ByteString template type for things like file content.

  • jj gerrit upload now supports the new options --message (-m), --edit
    and --merged. You can now also pass multiple hashtags by repeating the
    --hashtag option.

  • New remotes.<name>.fetch-bookmarks/fetch-tags options to configure
    default fetch targets.

  • JJ_PAGER can now override the ui.pager config, matching JJ_EDITOR for
    callers that need a jj-specific environment override.

Fixed bugs

  • Improving consistency with git handling of .gitignore, including /
    after entries and \r\r\n for MacOS files.

  • jj status filters untracked paths by fileset
    #9287

  • Improved performance for snapshotting, visibly improving jj status
    speed for large repositories.

  • Pre-existing Git submodule directories are no longer considered conflicts in
    checkouts. #8065.

  • Fixed a panic in jj gerrit upload when run without -r and the
    inferred revision was immutable. #9398

  • jj status respects path filters in working copy summaries.

  • jj git remote rename/remove now updates the trunk() alias.

  • Commands would sometimes incorrectly diagnose a stale working copy and suggest
    running jj op integrate when it would have no effect. This should now be
    much less likely to happen in practice.
    #9314

Contributors

Thanks to the people who made this release happen!

v0.40.0

Choose a tag to compare

@martinvonz martinvonz released this 02 Apr 05:17

About

jj is a Git-compatible version control system that is both simple and powerful. See
the installation instructions to get started.

Release highlights

None

Breaking changes

None

Deprecations

None

New features

  • New diff_lines_added() and diff_lines_removed() revset functions for
    matching content on only one side of a diff.

  • The end parameter in the String.substr(start, end) templating method is
    now optional. If not given, substr() returns from start to the end of the
    string.

  • WorkspaceRef templates now provide a .root() method to show the absolute
    path to each workspace root.

  • The jj arrange TUI now includes immediate parents and children. They are not
    selectable and are dimmed by default.

  • jj arrange uses the default log template (builtin_log_compact) instead of
    the shorter commit summary style.

  • In the jj arrange TUI, the "swap up/down" actions now move along graph edges
    even if the commit rows are not adjacent.

  • Diff colors can now be configured
    differently for each format.

  • jj op log now includes the name of the workspace the operation was created
    from.

  • The config() template function now accepts a Stringify expression instead
    of LiteralString. This allows looking up configuration values dynamically.

  • jj op show, jj op diff, jj op log -p now only show "interesting"
    revisions by default (defined by revsets.op-diff-changes-in). A new flag,
    --show-changes-in, can be used to override this. #6083

Fixed bugs

  • .gitignore with UTF-8 BOM can now be parsed correctly.

  • Fix incompatibility with gpgsm 2.5.x.

Contributors

Thanks to the people who made this release happen!

v0.39.0

Choose a tag to compare

@thoughtpolice thoughtpolice released this 04 Mar 18:28

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 arrange command brings up a TUI where you can reorder and abandon
    revisions. #1531

  • jj bookmark advance automatically moves bookmarks forward to a
    target revision (defaults to @) using customization points
    revsets.bookmark-advance-from and revsets.bookmark-advance-to.
    It is heavily inspired by the longstanding community alias jj tug.

Breaking changes

  • Dropped support for legacy index files written by jj < 0.33. New index files
    will be created as needed.

  • The following deprecated config options have been removed:

    • core.fsmonitor
    • core.watchman.register-snapshot-trigger
  • The deprecated command jj op undo has been removed. Use jj op revert or
    jj undo/redo instead.

Deprecations

  • jj debug snapshot is deprecated in favor of jj util snapshot. Although
    this was an undocumented command in the first place, it will be removed after
    6 months (v0.45.0) to give people time to migrate away.

New features

  • Add support for push options in jj git push with the --option flag.
    This allows users to pass options to the remote server when pushing commits.
    The short alias -o is also supported.

  • jj new now evaluates the new_description template to populate the
    initial commit description when no -m message is provided.

  • Templates now support first(), last(), get(index), reverse(),
    skip(count), and take(count) methods on list types for more flexible
    list manipulation.

  • New builtin_draft_commit_description_with_diff template that includes the
    diff in the commit description editor, making it easier to review changes
    while writing commit messages.

  • Revsets and templates now support name:x pattern aliases such as 'grep:x' = 'description(regex:x)'.

  • Filesets now support user aliases.

  • jj workspace add now links with relative paths. This enables workspaces to work
    inside containers or when moved together. Existing workspaces with absolute paths
    will continue to work as before.

  • jj undo now also outputs what operation was undone, in addition to the
    operation restored to.

  • Bookmarks with two or more consecutive - characters no longer need to be quoted
    in revsets. For example, jj diff -r '"foo--bar"' can now be written as jj diff -r foo--bar.

  • New flag --simplify-parents on jj rebase to apply the same transformation
    as jj simplify-parents on the rebased commits.
    #7711

  • jj rebase --branch and jj rebase --source will no longer return an error
    if the given argument resolves to an empty revision set
    (jj rebase --revisions already behaved this way). Instead, a message will be
    printed to inform the user why nothing has changed.

  • Changed Git representation of conflicted commits to include files from the
    first side of the conflict. This should prevent unchanged files from being
    highlighted as "added" in editors when checking out a conflicted commit in a
    colocated workspace.

  • New template function Timestamp::since(ts) that returns the TimestampRange
    between two timestamps. It can be used in conjunction with .duration() in
    order to obtain a human-friendly duration between two Timestamps.

  • Added new jj util snapshot command to manually or programmatically trigger a
    snapshot. This introduces an official alternative to the
    previously-undocumented jj debug snapshot command. The Watchman integration
    has also been updated to use this command instead.

  • Changed background snapshotting to suppress stdout and stderr to avoid long
    hangs.

  • jj gerrit upload now supports a variety of new flags documented in
    gerrit's documentation.
    This includes, for example, --reviewer=foo@example.com and
    --label=Auto-Submit.

  • jj gerrit upload now recognizes Change-Id explicitly set via the alternative
    trailer Link, and will generate a Link: <review-url>/id/<change-id> trailer
    if gerrit.review-url option is set.

  • jj gerrit upload no longer requires the -r flag, and will default to
    uploading what you're currently working on.

  • Templates now support Serialize operations on the result of map() and
    if(), when supported by the underlying type.

  • jj bookmark rename now supports --overwrite-existing to allow renaming a
    bookmark even if the new name already exists, effectively replacing the
    existing bookmark.

  • Conditional configuration based on environment variables with --when.environments.
    #8779

Fixed bugs

  • Windows: use native file locks (LockFileEx) instead of polling with file
    creation, fixing issues with "pending delete" semantics leaving lock files
    stuck.

  • jj now safely detaches the HEAD of alternate Git worktrees if their
    checked-out branch is moved or deleted during Git export.

  • jj file track --include-ignored now works when fsmonitor.backend="watchman".
    #8427

Contributors

Thanks to the people who made this release happen!

v0.38.0

Choose a tag to compare

@martinvonz martinvonz released this 05 Feb 14:42

About

jj is a Git-compatible version control system that is both simple and powerful. See
the installation instructions to get started.

Release highlights

  • Per-repo and per-workspace config is now stored outside the repo, for security
    reasons. This is not a breaking change because we automatically migrate
    legacy repos to this new format. .jj/repo/config.toml and
    .jj/workspace-config.toml should no longer be used.

Breaking changes

  • The minimum supported git command version is now 2.41.0. macOS users will
    need to either upgrade "Developer Tools" to 26 or install Git from
    e.g. Homebrew.

  • Deprecated ui.always-allow-large-revsets setting and all: revset modifier
    have been removed.

  • <name>@<remote> revset symbols can also be resolved to remote tags. Tags are
    prioritized ahead of bookmarks.

  • Legacy placeholder support used for unset user.name or user.email has been
    removed. Commits containing these values will now be pushed with jj git push
    without producing an error.

  • If any side of a conflicted file is missing a terminating newline, then the
    materialized file in the working copy will no longer be terminated by a
    newline.

Deprecations

  • The revset function diff_contains() has been renamed to diff_lines().

New features

  • jj git fetch now shows details of abandoned commits (change IDs and
    descriptions) by default, matching the jj abandon output format.
    #3081

  • jj workspace root now accepts an optional --name argument to show
    the root path of the specified workspace (defaults to the current one). When
    given a workspace that was created before this release, it errors out.

  • jj git push --bookmark <name> will now automatically track the bookmark if
    it isn't tracked with any remote already.

  • Add git_web_url([remote]) template function that converts a git remote URL
    to a web URL, suitable for opening in a browser. Defaults to the "origin"
    remote.

  • New divergent() revset function for divergent changes.

  • String pattern values in revsets and templates can now be substituted by
    aliases. For example, grep(x) = description(regex:x) now works.

  • A new config option remotes.<name>.auto-track-created-bookmarks behaves
    similarly to auto-track-bookmarks, but it only applies to bookmarks created
    locally. Setting it to "*" is now the closest replacement for the deprecated
    git.push-new-bookmarks option.

  • jj tag list can now be filtered by revset.

  • Conflict markers will use LF or CRLF as the line ending according to the
    contents of the file.
    #7376

  • New experimental jj git fetch --tag flag to fetch tags in the same way as
    bookmarks. If specified, tags won't be fetched implicitly, and only tags
    matching the pattern will be fetched as <name>@<remote> tags. The fetched
    remote tags will be tracked by the local tags of the same name.

  • New remote_tags() revset function to query remote tags.

  • New builtin hyperlink() template function that gracefully falls back to
    text when outputting to a non-terminal, instead of emitting raw OSC 8 escape
    codes. #7592

Fixed bugs

  • jj git init --colocate now refuses to run inside a Git worktree, providing
    a helpful error message with alternatives.
    #8052

  • jj git push now ensures that tracked remote bookmarks are updated even if
    there are no mappings in the Git fetch refspecs.
    #5115

  • jj git fetch/push now forwards most of git stderr outputs such as
    authentication requests. #5760

  • Conflicted bookmarks and tags in trunk() will no longer generate verbose
    warnings. The configured trunk() alias will temporarily be disabled.
    #8501

  • Dynamic shell completion for jj config unset now only completes
    configuration options which are set.
    #7774

  • Dynamic shell completion no longer attempts to resolve aliases at the
    completion position. This previously prevented a fully-typed alias from
    being accepted on some shells and replaced it entirely with its expansion on
    bash. Now, the completion will only resolve the alias, and suggest candidates
    accordingly, after the cursor has been advanced to the next position.
    #7773

  • Setting the editor via ui.editor, $EDITOR, or JJ_EDITOR now respects shell quoting.

  • jj gerrit upload will no longer swallow errors and surface if changes fail
    to get pushed to gerrit.
    #8568

  • jj file track --include-ignored now works when fsmonitor.backend="watchman".
    #8427

  • Conflict labels are now preserved correctly when restoring files from commits
    with different conflict labels.

  • The empty tree is now always written when the working copy is empty.
    #8480

  • When using the Watchman filesystem monitor, changes to .gitignore now trigger
    a scan of the affected subtree so newly unignored files are discovered.
    #8427

  • --quiet now hides progress bars.

Contributors

Thanks to the people who made this release happen!

v0.37.0

Choose a tag to compare

@thoughtpolice thoughtpolice released this 08 Jan 02:04

About

jj is a Git-compatible version control system that is both simple and powerful. See
the installation instructions to get started.

Release highlights

  • A new syntax for referring to hidden and divergent change IDs is available:
    xyz/n where n is a number. For instance, xyz/0 refers to the latest
    version of xyz, while xyz/1 refers to the previous version of xyz.
    This allows you to perform actions like jj restore --from xyz/1 --to xyz to
    restore xyz to its previous contents, if you made a mistake.

    For divergent changes, the numeric suffix will always be shown in the log,
    allowing you to disambiguate them in a similar manner.

Breaking changes

  • String patterns in revsets, command
    arguments, and configuration are now parsed as globs by default. Use
    substring: or exact: prefix as needed.

  • remotes.<name>.auto-track-bookmarks is now parsed the same way they
    are in revsets and can be combined with logical operators.

  • jj bookmark track/untrack now accepts --remote argument. If omitted, all
    remote bookmarks matching the bookmark names will be tracked/untracked. The
    old <bookmark>@<remote> syntax is deprecated in favor of <bookmark> --remote=<remote>.

  • On Windows, symlinks that point to a path with / won't be supported. This
    path is invalid on Windows.

  • The template alias format_short_change_id_with_hidden_and_divergent_info(commit)
    has been replaced by format_short_change_id_with_change_offset(commit).

  • The following deprecated config options have been removed:

    • git.push-bookmark-prefix
    • ui.default-description
    • ui.diff.format
    • ui.diff.tool
  • The deprecated commit_id.normal_hex() template method has been removed.

  • Template expansion that did not produce a terminating newline will not be
    fixed up to provide one by jj log, jj evolog, or jj op log.

  • The diff conflict marker style can now use \\\\\\\ markers to indicate
    the continuation of a conflict label from the previous line.

Deprecations

  • The git_head() and git_refs() functions will be removed from revsets and
    templates. git_head() should point to the first_parent(@) revision in
    colocated repositories. git_refs() can be approximated as
    remote_bookmarks(remote=glob:*) | tags().

New features

  • Updated the executable bit representation in the local working copy to allow
    ignoring executable bit changes on Unix. By default we try to detect the
    filesystem's behavior, but this can be overridden manually by setting
    working-copy.exec-bit-change = "respect" | "ignore".

  • jj workspace add now also works for empty destination directories.

  • jj git remote family of commands now supports different fetch and push URLs.

  • [colors] table now supports dim = true attribute.

  • In color-words diffs, context line numbers are now rendered with decreased
    intensity.

  • Hidden and divergent commits can now be unambiguously selected using their
    change ID combined with a numeric suffix. For instance, if there are two
    commits with change ID xyz, then one can be referred to as xyz/0 and the
    other can be referred to as xyz/1. These suffixes are shown in the log when
    necessary to make a change ID unambiguous.

  • jj util gc now prunes unreachable files in .jj/repo/store/extra to save
    disk space.

  • Early version of a jj file search command for searching for a pattern in
    files (like git grep).

  • Conflict labels now contain information about where the sides of a conflict
    came from (e.g. nlqwxzwn 7dd24e73 "first line of description").

  • --insert-before now accepts a revset that resolves to an empty set when
    used with --insert-after. The behavior is similar to --onto.

  • jj tag list now supports --sort option.

  • TreeDiffEntry type now has a display_diff_path() method that formats
    renames/copies appropriately.

  • TreeDiffEntry now has a status_char() method that returns
    single-character status codes (M/A/D/C/R).

  • CommitEvolutionEntry type now has a predecessors() method which
    returns the predecessor commits (previous versions) of the entry's commit.

  • CommitEvolutionEntry type now has a inter_diff() method which
    returns a TreeDiff between the entry's commit and its predecessor version.
    Optionally accepts a fileset literal to limit the diff.

  • jj file annotate now reports an error for non-files instead of succeeding
    and displaying no content.

  • jj workspace forget now warns about unknown workspaces instead of failing.

Fixed bugs

  • Broken symlink on Windows. #6934.

  • Fixed failure on exporting moved/deleted annotated tags to Git. Moved tags are
    exported as lightweight tags.

  • jj gerrit upload now correctly handles mixed explicit and implicit
    Change-Ids in chains of commits (#8219)

  • jj git push now updates partially-pushed remote bookmarks accordingly.
    #6787

  • Fixed problem of loading large Git packfiles.
    GitoxideLabs/gitoxide#2265

  • The builtin pager won't get stuck when stdin is redirected.

  • jj workspace add now prevents creating an empty workspace name.

  • Fixed checkout of symlinks pointing to themselves or .git/.jj on Unix. The
    problem would still remain on Windows if symlinks are enabled.
    #8348

  • Fixed a bug where jj would fail to read git delta objects from pack files.
    GitoxideLabs/gitoxide#2344

Contributors

Thanks to the people who made this release happen!

v0.36.0

Choose a tag to compare

@martinvonz martinvonz released this 04 Dec 06:42

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 alias 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

Choose a tag to compare

@scott2000 scott2000 released this 06 Nov 03:07

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