Jujutsu

Developer Tools

A Git-compatible version control system with a working-copy-as-commit model.

Latest v0.44.0 · by jj-vcsWebsitejj-vcs/jj

Release activity

Release activity — 10 releases across 10 days since Nov 6, 2025. Each cell is one day; darker means more releases that day. Nothing is recorded before Nov 6, 2025. Older weeks are hidden at this screen width.
MayJunJulAug
SundayNo releases on Apr 26, 2026No releases on May 3, 2026No releases on May 10, 2026No releases on May 17, 2026No releases on May 24, 2026No releases on May 31, 2026No releases on Jun 7, 2026No releases on Jun 14, 2026No releases on Jun 21, 2026No releases on Jun 28, 2026No releases on Jul 5, 2026No releases on Jul 12, 2026No releases on Jul 19, 2026No releases on Jul 26, 2026No releases on Aug 2, 2026No releases on Aug 9, 2026
MondayNo releases on Apr 27, 2026No releases on May 4, 2026No releases on May 11, 2026No releases on May 18, 2026No releases on May 25, 2026No releases on Jun 1, 2026No releases on Jun 8, 2026No releases on Jun 15, 2026No releases on Jun 22, 2026No releases on Jun 29, 2026No releases on Jul 6, 2026No releases on Jul 13, 2026No releases on Jul 20, 2026No releases on Jul 27, 2026No releases on Aug 3, 2026No releases on Aug 10, 2026
TuesdayNo releases on Apr 28, 2026No releases on May 5, 2026No releases on May 12, 2026No releases on May 19, 2026No releases on May 26, 2026No releases on Jun 2, 2026No releases on Jun 9, 2026No releases on Jun 16, 2026No releases on Jun 23, 2026No releases on Jun 30, 2026No releases on Jul 7, 2026No releases on Jul 14, 2026No releases on Jul 21, 2026No releases on Jul 28, 2026No releases on Aug 4, 2026No releases on Aug 11, 2026
WednesdayNo releases on Apr 29, 2026No releases on May 6, 2026No releases on May 13, 2026No releases on May 20, 2026No releases on May 27, 2026No releases on Jun 3, 2026No releases on Jun 10, 2026No releases on Jun 17, 2026No releases on Jun 24, 2026No releases on Jul 1, 2026No releases on Jul 8, 2026No releases on Jul 15, 2026No releases on Jul 22, 2026No releases on Jul 29, 2026No releases on Aug 5, 2026
ThursdayNo releases on Apr 30, 20261 release on May 7, 2026No releases on May 14, 2026No releases on May 21, 2026No releases on May 28, 20261 release on Jun 4, 2026No releases on Jun 11, 2026No releases on Jun 18, 2026No releases on Jun 25, 20261 release on Jul 2, 2026No releases on Jul 9, 2026No releases on Jul 16, 2026No releases on Jul 23, 2026No releases on Jul 30, 20261 release on Aug 6, 2026
FridayNo releases on May 1, 2026No releases on May 8, 2026No releases on May 15, 2026No releases on May 22, 2026No releases on May 29, 2026No releases on Jun 5, 2026No releases on Jun 12, 2026No releases on Jun 19, 2026No releases on Jun 26, 2026No releases on Jul 3, 2026No releases on Jul 10, 2026No releases on Jul 17, 2026No releases on Jul 24, 2026No releases on Jul 31, 2026No releases on Aug 7, 2026
SaturdayNo releases on May 2, 2026No releases on May 9, 2026No releases on May 16, 2026No releases on May 23, 2026No releases on May 30, 2026No releases on Jun 6, 2026No releases on Jun 13, 2026No releases on Jun 20, 2026No releases on Jun 27, 2026No releases on Jul 4, 2026No releases on Jul 11, 2026No releases on Jul 18, 2026No releases on Jul 25, 2026No releases on Aug 1, 2026No releases on Aug 8, 2026

10 releases since Nov 6, 2025

Changelog

v0.44.0

Added 14
  • Support for fetching and pushing tags, now stabilized with tracked or untracked tag management like bookmarks
  • New merge_point() revset function to find the point where multiple branches merge
  • jj workspace list now shows workspace roots by default with customizable output
  • New try(expr, fallback...) template function to suppress runtime errors
  • jj run now processes revisions from oldest to newest by default with guaranteed start order
  • jj run gained --passthrough flag to connect subprocess stdout/stderr directly to terminal
Changed 6
  • jj git fetch now fetches tags the same way it fetches bookmarks as <name>@<remote> with automatic tracking
  • jj git clone --fetch-tags=all|none|included removed in favor of --tag=PATTERN
  • jj git push --all now pushes all tags in addition to bookmarks
  • WorkspaceRef.root() and RepoPath.absolute() template functions now return Option<FsPath> and FsPath respectively instead of String
  • jj file search now prints every matched line prefixed by file path instead of only file paths
  • Passing an argument more than once is no longer an error, with last occurrence winning
Fixed 7
  • Recursive alias definitions are detected more precisely to allow repeated aliases and fallback to default commands
  • Git temporary files are now cleaned up more reliably in the presence of signals
  • Fixed Git HEAD mismatch after the working copy became immutable
  • jj now creates a new working-copy revision as soon as the current workspace becomes immutable and during snapshotting
  • Snapshotting no longer fails if working copy contains a path with non-UTF-8 name
  • Fixed failure when reading configuration in copied repo with empty repo-level configuration directory
  • jj diff and jj status no longer omit a rename or copy in merge commit when renamed source is present in multiple parents
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!

  • Aaron Bies (@slerpyyy)
  • Ada Alakbarova (@ada4a)
  • Alexandre Hallaine (@alexandre-hallaine)
  • Amaan Qureshi (@amaanq)
  • Austin Seipp (@thoughtpolice)
  • Caleb White (@calebdw)
  • Chawye Hsu (@chawyehsu)
  • David Rieber (@drieber)
  • Gaëtan Lehmann (@glehmann)
  • hexbinoct (@hexbinoct)
  • ivelieu (@ivelieu)
  • Joseph Lou (@josephlou5)
  • Josh McKinney (@joshka)
  • Josh Steadmon (@steadmon)
  • Kevin Liao (@kevincliao)
  • Luna Schwalbe (@lunagl)
  • Martin von Zweigbergk (@martinvonz)
  • Matt Van Horn (@mvanhorn)
  • Nika Layzell (@mystor)
  • Niko Savola (@nikosavola)
  • Nitzan Raz (@BackSlasher)
  • Noah Lev (@camelid)
  • OlshaMB (@OlshaMB)
  • Philip Metzger (@PhilipMetzger)
  • Remo Senekowitsch (@senekor)
  • Rob Pilling (@bobrippling)
  • Stephen Jennings (@jennings)
  • Techcable (@Techcable)
  • TogarashiPepper (@TogarashiPepper)
  • Vladimir Petrzhikovskii (@0xdeafbeef)
  • Waleed Khan (@arxanas)
  • Wang Yuantao (@0WD0)
  • xtqqczze (@xtqqczze)
  • Yash Bavadiya (@xevrion)
  • Yuya Nishihara (@yuja)
View originalPermalink
How v0.44.0 went

v0.43.0

Added 7
  • Add `jj run` command to run a command over a set of changes, each with their own private working copy, with commands updating the working copy and changes/conflicts propagated accordingly
  • Add `--reversed` flag to `jj show` command
  • Add support for looking for config files in `/etc/jj`
  • Add `jj config gc` to delete configuration of deleted or moved repos from `~/.config/jj/repos` folder
  • Add `-o` (`--option`) flag to `jj gerrit upload` command, working like `git push -o` (`--push-option`)
  • Add `forks()` revset function that yields all commits with more than 1 child
  • Add support for crossed-out text styling with `{ crossed-out = true }` in `colors` config
Changed 1
  • `jj git fetch` now rebases the descendants of revisions that were rewritten based on their change IDs
Fixed 4
  • Fix Windows behavior where querying a path's file identity no longer follows symbolic links, matching Unix behavior
  • Fix `jj` to create a new working-copy revision during snapshotting if the working copy was immutable
  • Add warning in `jj git remote add` if the new remote exactly matches an existing remote's fetch URL or effective push URL
  • Fix corrupt loose Git objects on Intel Raptor Lake CPU and aarch64
Removed 4
  • Remove deprecated `git_head()` and `git_refs()` functions from revsets and templates
  • Remove Git-like symbol resolution (e.g. `refs/heads/main`) from revisions; use bookmark/tag `<name>` or `<name>@<remote>` syntax instead
  • Remove deprecated `ui.revsets-use-glob-by-default` option
  • Remove `<kind>:<bookmark>@<remote>` pattern support from `jj bookmark track`/`untrack` commands
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!

  • adlerd (@adlerd)
  • ase (@adamse)
  • Atakan Yenel (@atakanyenel)
  • Austin Seipp (@thoughtpolice)
  • Benjamin Tan (@bnjmnt4n)
  • David Rieber (@drieber)
  • figsoda (@figsoda)
  • Gaëtan Lehmann (@glehmann)
  • hexbinoct (@hexbinoct)
  • Jakub Stasiak (@jstasiak)
  • Jonas Carpay (@jonascarpay)
  • Joseph Lou (@josephlou5)
  • Josh McKinney (@joshka)
  • Josh Steadmon (@steadmon)
  • Martin von Zweigbergk (@martinvonz)
  • Matt Stark (@matts1)
  • Philip Metzger (@PhilipMetzger)
  • shoce (@shoce)
  • Stephen Jennings (@jennings)
  • Thomas Axelsson (@thomas-2nd)
  • Vincent Ging Ho Yim (@cenviity)
  • Yuya Nishihara (@yuja)
View originalPermalink
How v0.43.0 went

v0.42.0

Added 4
  • Shell completions now surface descriptions for custom aliases, revset-aliases, template-aliases, and fileset-aliases extracted from the .doc field
  • jj git fetch now generates evolution history based on change IDs and rebases local descendant revisions onto rewritten parents when change IDs are preserved by the remote
  • 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 with file-by-file mode to launch the editor once per changed file
Changed 2
  • Switched to the mimalloc memory allocator for better multi-threaded performance
  • jj show now accepts multiple revisions, showing all of them one after the other, behaving closer to git show
Fixed 4
  • jj git remote add now reports an error instead of panicking when the remote name is empty or contains whitespace
  • Color-words diffs are now shown as separate before and after lines when color output is disabled
  • jj bookmark forget no longer prints Forgot N local bookmarks message when no local bookmarks were actually forgotten
  • The builtin_log_redacted template now also redacts workspace names
Removed 2
  • Removed deprecated command options: jj commit --reset-author/--author, jj describe --no-edit/--edit/--reset-author/--author, jj git push --allow-new, and jj metaedit --update-committer-timestamp
  • Removed deprecated config options: git.auto-local-bookmark and git.push-new-bookmarks
Deprecated 1
  • jj evolog no longer supports legacy commit predecessors recorded in jj < 0.30
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!

  • Alex Jaspersen (@ajaspers)
  • Archer (@archer-321)
  • ase (@adamse)
  • Austin Seipp (@thoughtpolice)
  • David Rieber (@drieber)
  • Eyüp Can Akman (@eyupcanakman)
  • Jakub Stasiak (@jstasiak)
  • James Dixon (@lemonase)
  • Joseph Lou (@josephlou5)
  • Laurynas Keturakis (@laulauland)
  • Luna Schwalbe (@lunagl)
  • Martin von Zweigbergk (@martinvonz)
  • Niko Savola (@nikosavola)
  • OlshaMB (@OlshaMB)
  • Sergey Kasmy (@SergeyKasmy)
  • truffle (@truffle-dev)
  • Vincent Ging Ho Yim (@cenviity)
  • Yuya Nishihara (@yuja)
View originalPermalink
How v0.42.0 went

v0.41.0

Added 9
  • jj fix now supports formatting specific line ranges via line-range-arg and run-tool-if-zero-line-ranges configs
  • New global flag --no-integrate-operation to run commands without impacting repo state or working copy
  • The --pattern flag for file search now accepts various pattern kinds through kind:pattern syntax
  • New config option diff.git.show-path-prefix to suppress a/ and b/ path prefixes in diff --git output
  • New replace(pattern, content, replacement) template function supporting pattern replacement with lambda formatting
  • New ByteString template type for things like file content
Changed 3
  • 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 are private or have conflicts
  • Branch/bookmark patterns passed to jj git clone are now saved to jj repo settings file instead of .git/config
Fixed 8
  • Improved consistency with git handling of .gitignore including / after entries and \r\r\n for macOS files
  • jj status now filters untracked paths by fileset
  • Improved performance for snapshotting, visibly improving jj status speed for large repositories
  • Pre-existing Git submodule directories are no longer considered conflicts in checkouts
  • Fixed a panic in jj gerrit upload when run without -r and the inferred revision was immutable
  • jj status now respects path filters in working copy summaries
  • jj git remote rename/remove now updates the trunk() alias
  • Commands no longer incorrectly diagnose a stale working copy and suggest running jj op integrate when it would have no effect
Deprecated 1
  • In the templating language, Operation type's .tags() function has been deprecated in favor of .attributes()
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!

  • Adrian Freund (@freundTech)
  • ase (@adamse)
  • Austin Seipp (@thoughtpolice)
  • Benjamin Tan (@bnjmnt4n)
  • Björn Kautler (@Vampire)
  • David Higgs (@higgsd)
  • David Rieber (@drieber)
  • dzaima (@dzaima)
  • Federico G. Schwindt (@fgsch)
  • Gaëtan Lehmann (@glehmann)
  • hewigovens (@hewigovens)
  • Ilya Grigoriev (@ilyagr)
  • jonmeow (@jonmeow)
  • Joseph Lou (@josephlou5)
  • Josh McKinney (@joshka)
  • Jun Mukai (@jmuk)
  • Lucas Garron (@lgarron)
  • Martin von Zweigbergk (@martinvonz)
  • Matt Stark (@matts1)
  • Maximilian Gaß (@mxey)
  • OlshaMB (@OlshaMB)
  • Philip Metzger (@PhilipMetzger)
  • rayaq
  • Remo Senekowitsch (@senekor)
  • rishiad (@rishiad)
  • Ryan Patterson (@CGamesPlay)
  • Sebastian Barfurth (@sbarfurth)
  • Thomas Axelsson (@thomasa88)
  • xtqqczze (@xtqqczze)
  • Yuya Nishihara (@yuja)
View originalPermalink
How v0.41.0 went

v0.40.0

Added 6
  • 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, returning from `start` to the end of the string if not given
  • `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, dimmed by default and not selectable
  • 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
Changed 4
  • `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
  • The `config()` template function now accepts a `Stringify` expression instead of `LiteralString` to allow 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`, with a new `--show-changes-in` flag to override this
Fixed 2
  • `.gitignore` with UTF-8 BOM can now be parsed correctly
  • Fix incompatibility with gpgsm 2.5.x
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!

  • Aaron Sutton (@aaronjsutton)
  • Adam Sandberg Eriksson (@adamse)
  • Anton Älgmyr (@algmyr)
  • Austin Seipp (@thoughtpolice)
  • Benjamin Tan (@bnjmnt4n)
  • Ben Warren (@warrenbhw)
  • Bryant Chandler (@brychanrobot)
  • David Higgs (@higgsd)
  • Filip Weiss (@fiws)
  • Gabriel Goller (@kaffarell)
  • Gaëtan Lehmann (@glehmann)
  • Ilya Grigoriev (@ilyagr)
  • Jeff Turner (@jefft)
  • Joseph Lou (@josephlou5)
  • Josh Steadmon (@steadmon)
  • KITAGAWA Yasutaka (@kit494way)
  • Liam (@terror)
  • Li-Wen Hsu (@lwhsu)
  • Martin von Zweigbergk (@martinvonz)
  • Philip Metzger (@PhilipMetzger)
  • Poliorcetics (@poliorcetics)
  • Remo Senekowitsch (@senekor)
  • Rob Pilling (@bobrippling)
  • Scott Taylor (@scott2000)
  • Shnatu
  • Stephen Prater (@stephenprater)
  • Yuya Nishihara (@yuja)
  • Zeyi Fan (@fanzeyi)
View originalPermalink
How v0.40.0 went

v0.39.0

Added 14
  • Add `jj arrange` command to reorder and abandon revisions in a TUI
  • Add `jj bookmark advance` command to automatically move bookmarks forward to a target revision
  • Add support for push options in `jj git push` with the `--option` flag and `-o` short alias
  • Add `new_description` template evaluation in `jj new` to populate initial commit description
  • Add `first()`, `last()`, `get(index)`, `reverse()`, `skip(count)`, and `take(count)` methods on list types in templates
  • Add `builtin_draft_commit_description_with_diff` template that includes diff in commit description editor
Changed 7
  • Relative paths now used by `jj workspace add` to enable workspaces in containers or when moved together
  • `jj undo` now outputs what operation was undone in addition to the operation restored to
  • Bookmarks with two or more consecutive `-` characters no longer require quoting in revsets
  • `jj rebase --branch` and `jj rebase --source` now print a message instead of returning an error for empty revision sets
  • Changed Git representation of conflicted commits to include files from first side of conflict
  • Background snapshotting now suppresses stdout and stderr to avoid long hangs
  • `jj gerrit upload` no longer requires the `-r` flag and defaults to uploading current work
Fixed 3
  • Windows: use native file locks (LockFileEx) instead of polling with file creation
  • `jj` now safely detaches HEAD of alternate Git worktrees if their checked-out branch is moved or deleted
  • `jj file track --include-ignored` now works when fsmonitor.backend is set to watchman
Removed 3
  • Drop support for legacy index files written by jj < 0.33
  • Remove deprecated config options `core.fsmonitor` and `core.watchman.register-snapshot-trigger`
  • Remove deprecated command `jj op undo`
Deprecated 1
  • `jj debug snapshot` is deprecated in favor of `jj util snapshot` and will be removed in v0.45.0
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!

  • Aaron Christiansen (@AaronC81)
  • Andy Brenneke (@abrenneke)
  • Anton Älgmyr (@algmyr)
  • Austin Seipp (@thoughtpolice)
  • Benjamin Tan (@bnjmnt4n)
  • Bram Geron (@bgeron)
  • Bryce Berger (@bryceberger)
  • Caleb White (@calebdw)
  • countskm (@countdigi)
  • David Higgs (@higgsd)
  • Evan Simmons (@estk)
  • Fedor Sheremetyev (@sheremetyev)
  • Gaëtan Lehmann (@glehmann)
  • George Christou (@gechr)
  • Hubert Lefevre (@Paluche)
  • Ian (@chronologos)
  • Ilya Grigoriev (@ilyagr)
  • Jaen (@jaens)
  • Joseph Lou (@josephlou5)
  • Josh Steadmon (@steadmon)
  • Martin von Zweigbergk (@martinvonz)
  • Matt Kulukundis (@fowles)
  • Matt Stark (@matts1)
  • max (@pr2502)
  • Nika Layzell (@mystor)
  • Philip Metzger (@PhilipMetzger)
  • Richard Smith (@zygoloid)
  • Scott Taylor (@scott2000)
  • Steve Klabnik (@steveklabnik)
  • Theodore Dubois (@tbodt)
  • William Phetsinorath (@shikanime)
  • xtqqczze (@xtqqczze)
  • Yuya Nishihara (@yuja)
View originalPermalink
How v0.39.0 went

v0.38.0

Added 8
  • jj workspace root now accepts an optional --name argument to show the root path of the specified workspace
  • Add git_web_url([remote]) template function that converts a git remote URL to a web URL
  • New divergent() revset function for divergent changes
  • New config option remotes.<name>.auto-track-created-bookmarks that only applies to bookmarks created locally
  • jj tag list can now be filtered by revset
  • New experimental jj git fetch --tag flag to fetch tags in the same way as bookmarks
  • 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
Changed 8
  • Per-repo and per-workspace config is now stored outside the repo for security reasons, with automatic migration of legacy repos
  • Minimum supported git command version is now 2.41.0
  • <name>@<remote> revset symbols can now be resolved to remote tags with tags prioritized ahead of bookmarks
  • If any side of a conflicted file is missing a terminating newline, the materialized file in the working copy will no longer be terminated by a newline
  • jj git fetch now shows details of abandoned commits by default, matching jj abandon output format
  • jj git push --bookmark <name> will now automatically track the bookmark if it isn't tracked with any remote already
  • String pattern values in revsets and templates can now be substituted by aliases
  • Conflict markers will use LF or CRLF as the line ending according to the contents of the file
Fixed 1
  • jj git init --colocate now refuses to run inside a Git worktree with a helpful error message
Removed 2
  • Deprecated ui.always-allow-large-revsets setting and all: revset modifier have been removed
  • Legacy placeholder support for unset user.name or user.email has been removed
Deprecated 1
  • The revset function diff_contains() has been renamed to diff_lines()
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!

  • Benjamin Davies (@Benjamin-Davies)
  • Bryce Berger (@bryceberger)
  • Chris Rose (@offbyone)
  • Daniel Morsing (@DanielMorsing)
  • David Fröhlingsdorf (@2079884FDavid)
  • David Higgs (@higgsd)
  • David Rieber (@drieber)
  • Federico G. Schwindt (@fgsch)
  • Gaëtan Lehmann (@glehmann)
  • George Christou (@gechr)
  • itstrivial
  • Jeff Turner (@jefft)
  • Jonas Greitemann (@jgreitemann)
  • Jonas Helgemo (@jonashelgemo)
  • Joseph Lou (@josephlou5)
  • Kaiyi Li (@06393993)
  • Lukas Wirth (@Veykril)
  • Martin von Zweigbergk (@martinvonz)
  • Matt Stark (@matts1)
  • Paul Smith (@paulsmith)
  • Pavan Kumar Sunkara (@pksunkara)
  • Philip Metzger (@PhilipMetzger)
  • Remo Senekowitsch (@senekor)
  • Sami Jawhar (@sjawhar)
  • Scott Taylor (@scott2000)
  • Simone Cattaneo (@simonecattaneo91)
  • Steve Klabnik (@steveklabnik)
  • tom (@lecafard)
  • Vincent Ging Ho Yim (@cenviity)
  • _WD_ (@0WD0)
  • xtqqczze (@xtqqczze)
  • Yuya Nishihara (@yuja)
  • yz (@yzheng453)
View originalPermalink
How v0.38.0 went

v0.37.0

Added 9
  • A new syntax for referring to hidden and divergent change IDs is available: `xyz/n` where `n` is a number, allowing actions like `jj restore --from xyz/1 --to xyz`
  • Updated the executable bit representation in the local working copy to allow ignoring executable bit changes on Unix with `working-copy.exec-bit-change = "respect" | "ignore"`
  • `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
  • `jj util gc` now prunes unreachable files in `.jj/repo/store/extra` to save disk space
Changed 8
  • String patterns in revsets, command arguments, and configuration are now parsed as globs by default, with `substring:` or `exact:` prefix available as needed
  • `remotes.<name>.auto-track-bookmarks` is now parsed the same way as in revsets and can be combined with logical operators
  • `jj bookmark track`/`untrack` now accepts `--remote` argument, with the `<bookmark>@<remote>` syntax deprecated in favor of `<bookmark> --remote=<remote>`
  • On Windows, symlinks that point to a path with `/` are no longer supported as 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)`
  • Template expansion that does not produce a terminating newline will not be fixed up 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
  • `jj workspace add` now works for empty destination directories
Removed 2
  • Removed deprecated config options: `git.push-bookmark-prefix`, `ui.default-description`, `ui.diff.format`, `ui.diff.tool`
  • Removed the deprecated `commit_id.normal_hex()` template method
Deprecated 1
  • The `git_head()` and `git_refs()` functions will be removed from revsets and templates
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. https://github.com/GitoxideLabs/gitoxide/issues/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. https://github.com/GitoxideLabs/gitoxide/issues/2344

Contributors

Thanks to the people who made this release happen!

  • Anton Älgmyr (@algmyr)
  • Austin Seipp (@thoughtpolice)
  • Bryce Berger (@bryceberger)
  • Carlos Knippschild (@chuim)
  • Cole Helbling (@cole-h)
  • David Higgs (@higgsd)
  • Eekle (@Eekle)
  • Gaëtan Lehmann (@glehmann)
  • Ian Wrzesinski (@isuffix)
  • Ilya Grigoriev (@ilyagr)
  • Julian Howes (@jlnhws)
  • Kaiyi Li (@06393993)
  • Lukas Krejci (@metlos)
  • Martin von Zweigbergk (@martinvonz)
  • Matt Stark (@matts1)
  • Ori Avtalion (@salty-horse)
  • Scott Taylor (@scott2000)
  • Shaoxuan (Max) Yuan (@ffyuanda)
  • Stephen Jennings (@jennings)
  • Steve Fink (@hotsphink)
  • Steve Klabnik (@steveklabnik)
  • Theo Buehler (@botovq)
  • Thomas Castiglione (@gulbanana)
  • Vincent Ging Ho Yim (@cenviity)
  • xtqqczze (@xtqqczze)
  • Yuantao Wang (@0WD0)
  • Yuya Nishihara (@yuja)
View originalPermalink
How v0.37.0 went

v0.36.0

Added 6
  • jj commit, jj describe, jj squash, and jj split now accept --editor to ensure an editor opens even if a description 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
  • Added join() template function
  • RepoPath template type now has an absolute() -> String method
  • Added format_path(path) template alias that controls how file paths are printed with jj file list
Changed 7
  • jj now ignores $PAGER set in the environment and uses less -FRX on most platforms (:builtin on Windows)
  • In filesets or path patterns, glob matching is enabled by default
  • String pattern arguments in jj bookmark delete/forget/list/move, jj tag delete/list, and jj git clone/fetch/push are now parsed the same way they are in revsets and can be combined with logical operators
  • Unmatched bookmark/tag names in jj bookmark delete/forget/move/track/untrack, jj tag delete, and jj git clone/push now print a warning instead of causing an error
  • Upgraded scm-record from v0.8.0 to v0.9.0
  • Minimum supported Rust version (MSRV) is now 1.89
  • Sub-repos are no longer tracked; any directory containing .jj or .git is ignored
Fixed 1
  • Fixed race condition that could cause divergent operations when running concurrent jj commands in colocated repositories
Removed 1
  • On macOS, the deprecated config directory ~/Library/Application Support/jj is not read anymore
Deprecated 4
  • The --destination/-d arguments for jj rebase, jj split, jj revert, etc. were renamed to --onto/-o
  • 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
  • The flag --allow-new on jj git push is deprecated
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!

  • abgox (@abgox)
  • ase (@adamse)
  • Björn Kautler (@Vampire)
  • Bryce Berger (@bryceberger)
  • Chase Naples (@cnaples79)
  • David Higgs (@higgsd)
  • edef (@edef1c)
  • Evan Mesterhazy (@emesterhazy)
  • Fedor (@sheremetyev)
  • Gaëtan Lehmann (@glehmann)
  • George Christou (@gechr)
  • Hubert Lefevre (@Paluche)
  • Ilya Grigoriev (@ilyagr)
  • Jonas Greitemann (@jgreitemann)
  • Joseph Lou (@josephlou5)
  • Julia DeMille (@judemille)
  • Kaiyi Li (@06393993)
  • Kyle Lippincott (@spectral54)
  • Lander Brandt (@landaire)
  • Lucio Franco (@LucioFranco)
  • Luke Randall (@lukerandall)
  • Martin von Zweigbergk (@martinvonz)
  • Matt Stark (@matts1)
  • Mitchell Skaggs (@magneticflux-)
  • Peter Schilling (@schpet)
  • Philip Metzger (@PhilipMetzger)
  • QingyaoLin (@QingyaoLin)
  • Remo Senekowitsch (@senekor)
  • Scott Taylor (@scott2000)
  • Stephen Jennings (@jennings)
  • Steve Klabnik (@steveklabnik)
  • Tejas Sanap (@whereistejas)
  • Tommi Virtanen (@tv42)
  • Velociraptor115 (@Velociraptor115)
  • Vincent Ging Ho Yim (@cenviity)
  • Yuya Nishihara (@yuja)
View originalPermalink
How v0.36.0 went

v0.35.0

Added 14
  • Workspaces can now have their own separate configuration via `.jj/workspace-config.toml` and `jj config` subcommands support `--workspace` layer option
  • Use `jj bookmark track` to associate local bookmarks with a specific remote before pushing without `--allow-new`
  • New `jj git colocation` command with `status`, `enable`, and `disable` subcommands to convert between colocated and non-colocated workspaces
  • New `jj tag set` and `jj tag delete` commands to create, update, and delete tags locally
  • Templates now support a `.split(separator, [limit])` method on strings
  • `-G` short form available for `--no-graph` in `jj log`, `jj evolog`, `jj op log`, `jj op show`, and `jj op diff`
Changed 1
  • Divergent changes are no longer marked red in immutable revisions
Fixed 5
  • `jj metaedit --author-timestamp` twice with the same value no longer edits the change twice
  • `jj squash` fixed improper revision rebase when both `--insert-after` and `--insert-before` were used
  • `jj undo` can now revert fetch and import operations involving tag updates
  • Fixed parsing of `files(expr)` revset expression including parentheses
  • Fixed `jj describe --stdin` to append a final newline character
Removed 3
  • The deprecated flag `--summary` of `jj abandon` has been removed
  • The deprecated command `jj backout` has been removed, use `jj revert` instead
  • Removed deprecated config options `signing.sign-all`, `core.watchman.register_snapshot_trigger`, and `diff.format`
Deprecated 2
  • `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`
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!

  • Alpha Chen (@kejadlen)
  • Angel Ezquerra (@AngelEzquerra)
  • ase (@adamse)
  • Austin Seipp (@thoughtpolice)
  • Benjamin Brittain (@benbrittain)
  • bipul (@bipulmgr)
  • Brian Schroeder (@bts)
  • Bryce Berger (@bryceberger)
  • Cole Helbling (@cole-h)
  • Daniel Luz (@mernen)
  • David Higgs (@higgsd)
  • Defelo (@Defelo)
  • Fedor (@sheremetyev)
  • Gabriel Goller (@kaffarell)
  • Gaëtan Lehmann (@glehmann)
  • George Christou (@gechr)
  • Ilya Grigoriev (@ilyagr)
  • Isaac Corbrey (@icorbrey)
  • James Coman (@jamescoman)
  • Joseph Lou (@josephlou5)
  • Lander Brandt (@landaire)
  • Martin von Zweigbergk (@martinvonz)
  • Michael Chirico (@MichaelChirico)
  • Owen Brooks (@owenbrooks)
  • Peter Schilling (@schpet)
  • Philip Metzger (@PhilipMetzger)
  • Remo Senekowitsch (@senekor)
  • Ross Smyth (@RossSmyth)
  • Scott Taylor (@scott2000)
  • Steve Fink (@hotsphink)
  • Steve Klabnik (@steveklabnik)
  • Theo Buehler (@botovq)
  • Theodore Dubois (@tbodt)
  • Theodore Keloglou (@sirodoht)
  • Yuya Nishihara (@yuja)
View originalPermalink
How v0.35.0 went
View all

Discussion