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)