Jujutsu
詳細情報
タイトル | Jujutsu |
---|---|
URL | https://github.com/martinvonz/jj |
バージョン | ver 0.21.0 |
更新日 | 2024/09/05 |
追加日 | 2024/02/08 |
種別 | フリーソフト / オープンソース(Apache) |
説明 | ソフトウェアプロジェクトのための強力なバージョン管理システム。 |
レビュー
Jujutsuはソフトウェア開発のための強力なバージョン管理ツール。
Googleのエンジニアによって開発されていて、現在デファクトスタンダードとなっているGitの複雑なコマンドラインの問題を解決し、直感的に使用できるようにデザインされている。物理的なバックエンドとして、ネイティブストレージのほかに、Gitリポジトリを使用することも可能。
以下のような特徴を持っている。
- コミットとしての作業コピー: ファイルへの変更は通常のコミットとして自動的に記録され、その後の変更のたびに修正される。この「スナップショット」デザインは、ユーザー向けのデータモデルを単純化し、内部アルゴリズムを単純化し、Gitの隠し場所やインデックス/ステージング領域のような機能を完全に包含する。
- 操作ログとアンドゥ: Jujutsuは、コミット、プル、プッシュに至るまで、リポジトリ上で実行されたすべての操作を記録する。
- 自動リベースと競合の解決: コミットを変更すると、すべての子孫は変更されたばかりのコミットの上に自動的にリベースされる。これにより、「パッチベース」のワークフローが簡単になる。
- 安全な同時レプリケーション: Jujutsuは同時実行シナリオの下で安全であるように設計されている。rsyncやDropboxで保存されたリポジトリを使用しても、リポジトリが破損した状態になることはない。最悪の場合、ローカルとリモートのコンフリクトが発生し、それを解決する必要がある。
Rustで作られていて、Windows/macOS/Linux用の実行ファイルが準備されている。
スクリーンショット
更新グラフ
バージョン履歴
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
Deprecations
-
jj checkout
andjj merge
are both deprecated; usejj new
instead to
replace both of these commands in all instances.Rationale:
jj checkout
andjj merge
both implement identical
functionality, which is a subset ofjj new
.checkout
creates a new working
copy commit on top of a single specified revision, i.e. with one parent.
merge
creates a new working copy commit on top of at least two specified
revisions, i.e. with two or more parents.The only difference between these commands and
jj new
, which also creates
a new working copy commit, is thatnew
can create a working copy commit on
top of any arbitrary number of revi