10个版本 (5个破坏性更新)
0.7.1 | 2023年7月18日 |
---|---|
0.7.0 | 2023年2月16日 |
0.6.1 | 2022年12月6日 |
0.5.1 | 2022年10月19日 |
0.2.0 | 2021年5月15日 |
#12 in #conflict
在jujutsu中使用
1MB
20K SLoC
已弃用
jujutsu
和jujutsu-lib
crate已被jj-cli
和jj-lib
crate替代。
请升级到jj-cli/
jj-lib
版本0.8+,或者如果您需要编译旧版本,请指定jujutsu/
jujutsu-lib
版本为"=0.7.0"。
Jujutsu VCS
免责声明
这不是一个谷歌产品。它是一个实验性的版本控制系统(VCS)。由我,Martin von Zweigbergk([email protected])编写。这是我个人的业余爱好项目和谷歌的20%项目。这并不代表谷歌有任何承诺或方向。然而,我在Git Merge 2022的演讲中确实包含了一些关于谷歌计划的信息。请参阅幻灯片或录像。
简介
Jujutsu是一个与Git兼容的分布式版本控制系统(DVCS)。它结合了Git(数据模型、速度)、Mercurial(匿名分支、简单的CLI 免于"the index"、revsets、强大的历史重写)以及Pijul/Darcs(一级冲突)的功能,还包含它们大多数没有的功能(工作副本作为提交、撤销功能、自动变基、通过rsync
、Dropbox或分布式文件系统进行安全复制)。
命令行工具目前称为jj
,因为它容易输入且容易替换(在英语中很少见)。该项目被称为"Jujutsu",因为它与"jj"相匹配。
功能
兼容Git
Jujutsu有两个后端。其中一个是Git后端(另一个是本地后端[^native-backend])。这使您可以将Jujutsu用作Git的替代界面。您创建的提交将看起来像常规的Git提交。您始终可以切换回Git。Git支持使用libgit2 C库。
[^native-backend]: 目前实际上没有理由使用本地后端(唯一可能的原因可能是#27)。后端的存在主要是为了确保最终可以添加无法轻松添加到Git后端的功能。
工作副本会自动提交
大多数Jujutsu命令会自动提交工作副本。这导致了一个更简单、更强大的界面,因为所有命令在工作副本或任何其他提交上都以相同的方式工作。这也意味着您可以在不首先显式提交工作副本更改的情况下检查出不同的提交(您甚至可以在解决合并冲突时检查出不同的提交)。
操作首先更新仓库,然后可能更新工作副本
工作副本只在操作结束时更新,在其他所有更改已记录之后。这意味着即使工作副本是脏的,您也可以运行任何命令(例如jj rebase
)。
整个仓库都受到版本控制
您在仓库中执行的所有操作都会被记录,以及操作后仓库状态的快照。这意味着您可以轻松地回滚到早期的仓库状态,或者简单地撤销特定的操作(这不需要是最近的操作)。
冲突可以记录在提交中
如果操作导致冲突,有关这些冲突的信息将被记录在提交中。操作将成功。然后您可以稍后解决冲突。这种设计的一个后果是,不需要继续中断的操作。相反,您会得到一个用于解决冲突的单个工作流程,无论哪个命令导致它们。这种设计还使Jujutsu能够正确地rebase合并提交(与Git和Mercurial不同)。
基本的冲突解决
玩弄冲突
自动rebase
每次您修改一个提交时,旧提交的所有后代会重新基于新的提交。感谢上面描述的冲突设计,即使在有冲突的情况下也可以这样做。指向rebase提交的分支将被更新。如果工作副本指向rebase提交,它也会被更新。
对修改历史记录的全面支持
除了常用的rebase命令外,还有jj describe
用于编辑任意提交的描述(提交信息)。还有jj diffedit
,它允许您在不检出提交的情况下编辑提交中的更改。要分割提交为两个,请使用jj split
。您甚至可以使用jj move
将提交中的部分更改移动到任何其他提交。
状态
该工具功能齐全,但像(相当于)git blame
这样的重要功能尚不支持。还有几个性能问题。也可能是不支持核心开发者使用的工作流程和设置。
自从2021年1月初以来,我(马丁·冯·齐格伯格克)几乎完全使用jj
来开发项目本身。我甚至不需要从源代码重新克隆(我认为我甚至不需要从备份中恢复)。
在版本1.0.0之前,工作流程和磁盘格式的向后不兼容更改将会出现。甚至是二进制的名称也可能更改(即不再是jj
)。对于任何格式更改,我们将尝试实现透明的升级(就像我们最近所做的),或者在请求的情况下提供升级命令或脚本。
安装
以下是如何从源代码构建的说明。还有适用于Windows、Mac或Linux(musl)的预构建二进制文件。
如果您是从源代码安装,则需要使用Rust版本1.61或更高版本,否则您将收到这样的神秘消息
error: failed to select a version for the requirement `libgit2-sys = "=0.14.0"``
candidate versions found which didn't match: 0.13.2+1.4.2, 0.13.1+1.4.2, 0.13.0+1.4.1, ...
Linux
在大多数发行版中,您需要直接使用cargo
从源代码构建。
使用cargo
构建
首先确保您已经通过运行类似以下命令安装了libssl-dev
、openssl
和pkg-config
软件包
sudo apt-get install libssl-dev openssl pkg-config
现在运行
cargo install --git https://github.com/martinvonz/jj.git --locked --bin jj jujutsu
Nix OS
如果您在Nix OS上,可以使用此存储库的flake。例如,如果您想从flake运行jj
,请使用
nix run 'github:martinvonz/jj'
您也可以将此flake URL添加到系统输入flake中。或者,您可以将flake安装到您的用户配置文件中
nix profile install 'github:martinvonz/jj'
Homebrew
如果您使用linuxbrew,可以运行
brew install jj
Mac
Homebrew
如果您使用Homebrew,可以运行
brew install jj
MacPorts
您也可以通过MacPorts(作为jujutsu
端口)安装jj
sudo port install jujutsu
(端口页面)
从源代码
您可能需要运行以下所有或其中一些命令
xcode-select --install
brew install openssl
brew install pkg-config
export PKG_CONFIG_PATH="$(brew --prefix)/opt/openssl@3/lib/pkgconfig"
现在运行
cargo install --git https://github.com/martinvonz/jj.git --locked --bin jj jujutsu
Windows
运行
cargo install --git https://github.com/martinvonz/jj.git --locked --bin jj jujutsu --features vendored-openssl
初始配置
您可能希望配置您的姓名和电子邮件,以便在您的姓名下进行提交。在~/.jjconfig.toml
中创建一个文件,并使其看起来像这样
$ cat ~/.jjconfig.toml
[user]
name = "Martin von Zweigbergk"
email = "[email protected]"
命令行补全
要设置命令行完成,source jj debug completion
的输出,具体方法取决于您的shell
Bash
source <(jj debug completion) # --bash is the default
Zsh
autoload -U compinit
compinit
source <(jj debug completion --zsh | sed '$d') # remove the last line
compdef _jj jj
Fish
jj debug completion --fish | source
Xonsh
source-bash $(jj debug completion)
入门指南
开始的最佳方式可能是查看教程。还可以查看Git比较,其中包含jj
与git
命令的表格。
相关工作
有几个工具试图解决与Jujutsu类似的问题。有关详细信息,请参阅相关工作。
依赖关系
~21–34MB
~624K SLoC