github jj-vcs/jj v0.38.0

7 hours ago

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!

Don't miss a new jj release

NewReleases is sending notifications on new releases.