Jujutsu
詳細情報
タイトル | Jujutsu |
---|---|
URL | https://github.com/martinvonz/jj |
バージョン | ver 0.23.0 |
更新日 | 2024/11/07 |
追加日 | 2024/02/08 |
種別 | フリーソフト / オープンソース(Apache) |
説明 | ソフトウェアプロジェクトのための強力なバージョン管理システム。 |
レビュー
Jujutsuはソフトウェア開発のための強力なバージョン管理ツール。
Googleのエンジニアによって開発されていて、現在デファクトスタンダードとなっているGitの複雑なコマンドラインの問題を解決し、直感的に使用できるようにデザインされている。物理的なバックエンドとして、ネイティブストレージのほかに、Gitリポジトリを使用することも可能。
以下のような特徴を持っている。
- コミットとしての作業コピー: ファイルへの変更は通常のコミットとして自動的に記録され、その後の変更のたびに修正される。この「スナップショット」デザインは、ユーザー向けのデータモデルを単純化し、内部アルゴリズムを単純化し、Gitの隠し場所やインデックス/ステージング領域のような機能を完全に包含する。
- 操作ログとアンドゥ: Jujutsuは、コミット、プル、プッシュに至るまで、リポジトリ上で実行されたすべての操作を記録する。
- 自動リベースと競合の解決: コミットを変更すると、すべての子孫は変更されたばかりのコミットの上に自動的にリベースされる。これにより、「パッチベース」のワークフローが簡単になる。
- 安全な同時レプリケーション: Jujutsuは同時実行シナリオの下で安全であるように設計されている。rsyncやDropboxで保存されたリポジトリを使用しても、リポジトリが破損した状態になることはない。最悪の場合、ローカルとリモートのコンフリクトが発生し、それを解決する必要がある。
Rustで作られていて、Windows/macOS/Linux用の実行ファイルが準備されている。
スクリーンショット
更新グラフ
バージョン履歴
Security fixes
- Fixed path traversal by cloning/checking out crafted Git repository containing
..
,.jj
,.git
paths. (GHSA-88h5-6w7m-5w56; CVE-2024-51990)
Breaking changes
-
Revset function names can no longer start with a number.
-
Evaluation error of
revsets.short-prefixes
configuration is now reported. -
The
HEAD@git
symbol no longer resolves to the Git HEAD revision. Use
git_head()
or@-
revset expression instead. Thegit_head
template
keyword now returns a boolean. -
Help command doesn't work recursively anymore, i.e.
jj workspace help root
doesn't work anymore. -
The color label
Breaking changes
-
Fixing #4239 means the
ordering of some messages have changed. -
Invalid
ui.graph.style
configuration is now an error. -
The builtin template
branch_list
has been renamed tobookmark_list
as part
of thejj branch
deprecation.
Deprecations
-
jj branch
has been deprecated in favor ofjj bookmark
.Rationale: Jujutsu's branches don't behave like Git branches, which a
confused many newcomers, as they expected a similar behavior given the name.
We've renamed them to "bookmarks" to match the actual behavior, as we think
that describes them better, and they also behave similar to Mercurial's
bookmarks.
Breaking changes
-
next/prev
will no longer infer when to go into edit mode when moving from
commit to commit. It now either follows the flags--edit|--no-edit
or it
gets the mode fromui.movement.edit
.
Deprecations
-
jj untrack
has been renamed tojj file untrack
.
New features
-
Add new boolean config knob,
ui.movement.edit
for controlling the behaviour
ofprev/next
. The flag turnsedit
modeon
andoff
permanently when set
respectively totrue
orfalse
. -
All diff formats except
--name-only
now include information about copies and
moves. So do exter
Note to packagers
-
jj
now linkslibgit2
statically by default. To use dynamic linking, you
need to set the environment variableLIBGIT2_NO_VENDOR=1
while compiling.
(#4163)
Breaking changes
-
jj rebase --skip-empty
has been renamed tojj rebase --skip-emptied
-
jj backout --revision
has been renamed tojj backout --revisions
.
The short alias-r
is still supported. -
The default
immutable_heads()
set
now includesuntracked_remote_branches()
with the assumption that untracked
branches aren't managed by you. Therefore, untracked branches are no longer
displayed injj log
by
Breaking changes
-
In revset aliases, top-level
kind:pattern
expression is now parsed as
modifier. Surround with parentheses if it should be parsed as string/file
pattern. -
Dropped support for automatic upgrade of repo formats used by versions before
0.12.0. -
jj fix
now defaults to the broader revset-s reachable(@, mutable())
instead of-s @
. -
Dropped support for deprecated
jj branch delete
/forget
--glob
option. -
jj branch set
now creates new branch if it doesn't exist. Usejj branch move
to ensure that the target branch already exists.
#3584
Deprecations
-
Replacing
Breaking changes
-
Dropped support for
ui.default-revset
config (replaced byrevsets.log
in
0.8.0). -
The
commit_summary_no_branches
template is superseded by
templates.branch_list
. -
jj split
will now refuse to split an empty commit. -
jj config list
now uses multi-line strings and single-quoted strings in the
output when appropriate. -
jj config get
/list
/set
now parsename
argument as TOML
key. Quote meta characters as needed.
Example:jj config get "revset-aliases.'trunk()'"
-
When updating the working copy away from an empty and undescribed commit, it
is now abandoned even if
Fixed bugs
-
jj status
no longer scans through the entire history to look for ancestors with conflicts.
Breaking changes
-
The default template aliases were replaced as follows:
-
builtin_op_log_root(op_id: OperationId)
->
format_root_operation(root: Operation)
-
builtin_log_root(change_id: ChangeId, commit_id: CommitId)
->
format_root_commit(root: Commit)
-
builtin_change_id_with_hidden_and_divergent_info
->
format_short_change_id_with_hidden_and_divergent_info(commit: Commit)
-
-
The
--revision
option ofjj rebase
is renamed to--revisions
. The short
alias-r
is still supported.
New features
-
The list of conflicted paths is printed whenever the working copy changes.
This can be
Deprecations
-
jj move
was deprecated in favor ofjj squash
.
Breaking changes
-
The
git_head
template keyword now returns an optional value instead of a
list of 0 or 1 element. -
The
jj sparse set --edit
/--reset
flags were split up intojj sparse edit
/reset
subcommands respectively. -
The
jj sparse
subcommands now parse and print patterns as workspace-relative
paths. -
The
jj log
command no longer uses the default revset when a path is specified.
New features
-
Config now supports rgb hex colors (in the form
#rrggbb
) wherever existing color names are supported.
No code changes (fixing Rust Cargo.toml stuff).
Breaking changes
-
The minimum supported Rust version (MSRV) is now 1.76.0.
-
The on-disk index format changed. New index files will be created
automatically, but it can fail if the repository is co-located and predates
Git GC issues #815. If
reindexing failed, you'll need to clean up corrupted operation history by
jj op abandon ..<bad operation ID>
. -
Dropped support for the "legacy" graph-drawing style. Use "ascii" for a very
similar result. -
The default log output no longer lists all tagged heads. Set
revsets.log = "@ | ancestors(immutable_heads().., 2) | heads(immutable_heads())"
to restore
the old behavior. -
Dropped support for the deprecated
:
revset operator. Use::
inst