About
jj is a Git-compatible version control system that is both simple and powerful. See the installation instructions to get started.
Release highlights
git.subprocessis now enabled by default, improving compatibility with Git fetches and pushes by spawning an externalgitprocess. Users can opt out of this by settinggit.subprocess = false, but this will likely be removed in a future release. Please report any issues you run into.
Breaking changes
-
Bookmark name to be created/updated is now parsed as a revset symbol. Quotation may be needed in addition to shell quotes. Example:
jj bookmark create -r@- "'name with space'" -
jj bookmark create,jj bookmark setandjj bookmark moveonto a hidden commit make it visible. -
jj bookmark forgetnow untracks any corresponding remote bookmarks instead of forgetting them, since forgetting a remote bookmark can be unintuitive. The old behavior is still available with the new--include-remotesflag. -
jj fixnow always sets the working directory of invoked tools to be the workspace root, instead of the working directory of thejj fix. -
The
ui.allow-filesetsconfiguration option has been removed. The "fileset" language has been enabled by default since v0.20. -
templates.annotate_commit_summaryis renamed totemplates.file_annotate, and now has an implicitselfparameter of typeAnnotationLine, instead ofCommit. All methods onCommitcan be accessed withcommit.method(), orself.commit().method().
Deprecations
-
This release takes the first steps to make target revision required in
bookmark create,bookmark moveandbookmark set. Those commands will display a warning if the user does not specify target revision explicitly. In the near future those commands will fail if target revision is not specified. -
The
signing.sign-allconfig option has been deprecated in favor ofsigning.behavior. The new option acceptsdrop(never sign),keep(preserve existing signatures),own(sign own commits), orforce(sign all commits). Existingsigning.sign-all = truetranslates tosigning.behavior = "own", andfalsetranslates to"keep". Invalid configuration is now an error.
New features
-
The new
jj signandjj unsigncommands allow for signing/unsigning commits.jj signsupports configuring the default revset throughrevsets.signwhen no--revisionsarguments are provided. -
jj git fetchnow supports string pattern syntax on--remoteoption andgit.fetchconfiguration. -
Template functions
truncate_start()andtruncate_end()gained an optionalellipsisparameter; passing this prepends or appends the ellipsis to the content if it is truncated to fit the maximum width. -
Templates now support
stringify(x)function and string method.escape_json(). The latter serializes the string in JSON format. It is useful for making machine-readable templates by escaping problematic characters like\n. -
Templates now support
trim(),trim_start()andtrim_end()methods which remove whitespace from the start and end of aStringtype. -
The description of commits backed out by
jj backoutcan now be configured usingtemplates.backout_description. -
New
AnnotationLinetemplater type. Used intemplates.file_annotate. Providesself.commit(),.content(),.line_number(), and.first_line_in_hunk(). -
Templates now have
format_short_operation_id(id)function for users to customize the default operation id representation. -
The
jj init/jj revertstubs that print errors can now be overridden with aliases. All ofjj clone/init/revertadd a hint to a generic error. -
Help text is now colored (when stdout is a terminal).
-
Commands that used to suggest
--ignore-immutablenow print the number of immutable commits that would be rewritten if used and a link to the docs. -
jj undonow shows a hint when undoing an undo operation that the user may be looking forjj op restoreinstead.
Fixed bugs
-
jj statusnow shows untracked files under untracked directories. #5389 -
Added workaround for the bug that untracked files are ignored when watchman is enabled. #5728
-
The
signing.backends.ssh.allowed-signersconfiguration option will now expand~/to$HOME/. #5626 -
config-schema.jsonnow allows arrays of strings for the settingsui.editorandui.diff.tool. -
config-schema.jsonnow allows an array of strings or nested table for theui.pagersetting.
Contributors
Thanks to the people who made this release happen!
- Alain Leufroy (@aleufroy)
- Aleksey Kuznetsov (@zummenix)
- Alexander Mikhailov (@AM5800)
- Andrew Gilbert (@andyg0808)
- Antoine Martin (@alarsyo)
- Anton Bulakh (@necauqua)
- Austin Seipp (@thoughtpolice)
- Baltasar Dinis (@bsdinis)
- Benjamin Tan (@bnjmnt4n)
- Bryce Berger (@bryceberger)
- Burak Varlı (@unexge)
- David Rieber (@drieber)
- Emily (@emilazy)
- Evan Mesterhazy (@emesterhazy)
- George Christou (@gechr)
- HKalbasi (@HKalbasi)
- Ilya Grigoriev (@ilyagr)
- Jacob Hayes (@JacobHayes)
- Jonathan Frere (@MrJohz)
- Jonathan Tan (@jonathantanmy)
- Josh Steadmon (@steadmon)
- maan2003 (@maan2003)
- Martin von Zweigbergk (@martinvonz)
- Matthew Davidson (@KingMob)
- Philip Metzger (@PhilipMetzger)
- Philipp Albrecht (@pylbrecht)
- Roman Timushev (@rtimush)
- Samuel Tardieu (@samueltardieu)
- Scott Taylor (@scott2000)
- Stephan Hügel (@urschrei)
- Vincent Ging Ho Yim (@cenviity)
- Yuya Nishihara (@yuja)