v0.29.0

jj-vcs/jjv0.29.0May 7, 2025by thoughtpolice

AI Summary

Experimental support for storing change IDs in Git commit headers has been added, color-words diff options have been expanded, and commit trailers are now supported in various commit commands.

Key Highlights

  • Experimental support for transferring the change ID to Git remotes is enabled behind `git.write-change-id-header`
  • Color-words diff has gained an option to compare conflict pairs without materializing
  • Commit trailers are now added to descriptions in `jj describe`, `jj commit`, etc.

Breaking Changes

  • `jj git push -c`/`--change` no longer moves existing local bookmarks
  • The `editor-*.jjdescription` files passed to editors are now written to the system's temporary directory

New Features

  • Added `ui.bookmark-list-sort-keys` setting
  • New `signed` revset function to filter for cryptographically signed commits
  • Added `duplicate_description` template to customize descriptions of commits created by `jj duplicate`
  • `jj absorb` can now squash a deleted file if it was added by one of the destination revisions
  • Commit objects in templates now have `trailers() -> List<Trailer>`

Full Release Notes

### About

jj is a Git-compatible version control system that is both simple and powerful. See the [installation instructions](https://jj-vcs.github.io/jj/v0.29.0/install-and-setup/) to get started.

### Release highlights

* Experimental support for transferring the change ID to/from Git remotes behind configuration
  setting `git.write-change-id-header`. If this is enabled, the change ID will be stored in the Git
  commit itself (in a commit header called `change-id`), which means it will be transferred by
  regular `git push` etc. This is an evolving feature that currently defaults to "false". This
  default will likely change in the future as we gain confidence with forge support and user
  expectations.

### Breaking changes

* `jj git push -c`/`--change` no longer moves existing local bookmarks.

* The `editor-*.jjdescription` files passed to your editor by e.g. `jj describe`
  are now written to your system's temporary directory instead of `.jj/repo/`.

### Deprecations

* `git.subprocess = false` has been deprecated, and the old `libgit2`
  code path for fetches and pushes will be removed entirely in 0.30.
  Please report any remaining issues you have with the Git
  subprocessing path.

* `ui.default-description` has been deprecated, and will be migrated to
  `template-aliases.default_commit_description`. Please also consider using
  [`templates.draft_commit_description`](docs/config.md#default-description),
  and/or [`templates.commit_trailers`](docs/config.md#commit-trailers).

* On macOS, config.toml files in `~/Library/Application Support/jj` are
  deprecated; one should instead use `$XDG_CONFIG_HOME/jj`
  (defaults to `~/.config/jj`)

### New features

* Color-words diff has gained [an option to compare conflict pairs without
  materializing](docs/config.md#color-words-diff-options).

* `jj show` patches can now be suppressed with `--no-patch`.

* Added `ui.bookmark-list-sort-keys` setting to configure default sort keys for the
  `jj bookmark list` command.

* New `signed` revset function to filter for cryptographically signed commits.

* `jj describe`, `jj commit`, `jj new`, `jj squash` and `jj split` add the
  commit trailers, configured in the `commit_trailers` template, to the commit
  description. Use cases include DCO Sign Off and Gerrit Change Id.

* Added `duplicate_description` template, which allows [customizing the descriptions
  of the commits `jj duplicate` creates](docs/config.md#duplicate-commit-description).

* `jj absorb` can now squash a deleted file if it was added by one of the
  destination revisions.

* Added `ui.streampager.show-ruler` setting to configure whether the ruler should be
  shown when the builtin pager starts up.

* `jj git fetch` now warns instead of erroring for unknown `git.fetch` remotes
  if other remotes are available.

* Commit objects in templates now have `trailers() -> List<Trailer>`, the Trailer
  objects have `key() -> String` and `value() -> String`.

* `jj config edit` will now roll back to previous version if a syntax error has been introduced in the new config.

* When using dynamic command-line completion, revision names will be completed
  in more complex expressions. For example, typing
  `jj log -r first-bookmark..sec` and then pressing Tab could complete the
  expression to `first-bookmark..second-bookmark`.

### Fixed bugs

* Fixed crash on change-delete conflict resolution. [#6250](https://github.com/jj-vcs/jj/issues/6250)

* The builtin diff editor now tries to preserve unresolved conflicts. [#4963](https://github.com/jj-vcs/jj/issues/4963)

* Fixed bash and zsh shell completion when completing aliases of multiple arguments. [#5377](https://github.com/jj-vcs/jj/issues/5377)

### Packaging changes

* Jujutsu now uses [`zlib-rs`](https://github.com/trifectatechfoundation/zlib-rs), a fast compression library written in Rust. Packagers should remove any dependency on CMake and drop the `packaging` Cargo feature.

### Contributors

Thanks to the people who made this release happen!

* Aleksey Kuznetsov (@zummenix)
* Austin Seipp (@thoughtpolice)
* Benjamin Brittain (@benbrittain)
* Benjamin Tan (@bnjmnt4n)
* Caleb White (@calebdw)
* Daniel Luz (@mernen)
* Emily (@emilazy)
* Emily (@neongreen)
* Gaëtan Lehmann (@glehmann)
* George Christou (@gechr)
* Ilya Grigoriev (@ilyagr)
* Jacob Hayes (@JacobHayes)
* Jonas Greitemann (@jgreitemann)
* Josh Steadmon (@steadmon)
* Martin von Zweigbergk (@martinvonz)
* Mateus Auler (@mateusauler)
* Nicole Patricia Mazzuca (@strega-nil)
* Nils Koch (@nilskch)
* Philip Metzger (@PhilipMetzger)
* Remo Senekowitsch (@senekor)
* Sam (@Samasaur1)
* Steve Fink (@hotsphink)
* Théo Daron (@tdaron)
* TimerErTim (@TimerErTim)
* Vincent Ging Ho Yim (@cenviity)
* Winter (@winterqt)
* Yuya Nishihara (@yuja)