jj 0.44.0 发布:标签功能稳定,Git 兼容性增强
关于
jj 是一个既简单又强大的 Git 兼容版本控制系统。请参阅
安装指南 开始使用。
版本亮点
- 获取和推送标签的功能现已稳定。标签可以像书签一样被追踪或取消追踪。默认情况下,被追踪的标签会被推送。
重大变更
-
jj git fetch现在获取标签的方式与获取书签相同。标签以<名称>@<远程仓库>的形式获取,这些远程标签会自动被同名的本地标签追踪。在现有仓库中运行jj git fetch会重新获取所有标签以初始化追踪状态。Git 的
tagOpt设置不再生效。要禁用标签获取,请在 jj 配置中设置remotes.<名称>.fetch-tags = '~*'。 -
jj git clone --fetch-tags=all|none|included已被移除,改用--tag=PATTERN。 -
jj git push --all现在除了推送书签外,还会推送所有标签。 -
WorkspaceRef.root()和RepoPath.absolute()模板函数现在分别返回Option<FsPath>和FsPath,而非String。在jj config list模板中使用的path关键字现在返回Option<FsPath>。 -
jj file search现在会打印每个匹配行,并在前面加上文件路径,而不仅仅是包含匹配内容的文件路径。要恢复之前的行为,请使用--name-only。
#9399 -
重复传递同一个参数不再报错。以最后一次出现的值为准,因此
jj --no-pager --no-pager version和jj log -n 5 -n 10现在可以正常工作,并且别名或包装器中内置的参数也可以显式给出。可以多次指定的参数(如--config和jj log -r)不受影响,仍会收集所有值。
#8101
#9859
弃用说明
无
新功能
-
新增
merge_point()revset 函数,功能类似fork_point,用于查找多个分支合并的交汇点。 -
jj workspace list现在默认显示工作区根目录。输出可通过templates.workspace_list或-T自定义,WorkspaceRef.root()返回可选的FsPath值。
#9713,
#9826 -
新增
try(expr, fallback...)模板函数,用于抑制运行时错误。 -
jj run现在默认按从旧到新的顺序处理修订版本。启动顺序有保证:即使--jobs大于 1,每个修订版本也只有在上一版本启动后才会开始执行。 -
jj run新增--passthrough标志,可将子进程的 stdout/stderr 直接连接到终端,而非捕获输出。 -
jj run新增--ignore-changes标志,即使命令修改了工作副本,也避免编辑任何修订版本。 -
jj run新增--ignore-errors标志,即使命令以非零退出码退出,也会继续对剩余修订版本执行。 -
jj file search现在支持-n/--line-number,可在每个匹配项前加上其在文件中的行号(从 1 开始)。 -
jj git push新增--allow-conflicts标志,允许推送包含冲突的提交。 -
新增
jj tag track/untrack命令,用于将本地标签与远程关联。注意,获取的标签默认会被跟踪。 -
为内置默认的
jj logrevset 添加了builtin_log()revset 别名。revsets.log现在默认使用builtin_log(),因此自定义日志 revset 可以复用内置默认值,而无需复制其完整表达式。 -
新增配置选项
接受第二个(位置参数或命名参数)diff.stat.max-bar-width,用于配合--stat限制++--条的宽度。在模板语言中,diff.stat()可以可选地max_bar_width,以达到同等效果。 -
jj absorb现在支持--interactive/-i/--tool参数,让你可以交互式选择从源提交中吸收哪些代码块。当你只想吸收提交的部分内容,又不想先拆分它时,这个功能非常有用。未被选中或无法吸收的代码块会保留在源提交中。
修复的 Bug
-
递归别名定义的检测更加精确。现在 jj 可以展开简单重复的别名。例如,对于别名
jj = [],命令jj jj jj会解析为jj。别名也可以回退到默认命令。例如,对于别名i = ["--ignore-working-copy"],jj i会解析为jj --ignore-working-copy。 -
现在,在遇到信号(例如
Ctrl-C)时,Git 临时文件的清理更加可靠。这应该能减少“无法获取索引文件锁”错误的出现频率。(#7530) -
修复了工作副本变为不可变后 Git HEAD 不匹配的问题。#9827
-
jj现在会在当前工作区的工作副本变为不可变时,以及在快照过程中,立即创建一个新的工作副本修订版本。这使得行为更接近jj0.42 及更早版本。 -
如果工作副本包含名称不是有效 UTF-8 的路径,快照操作不再失败。此类路径无法被跟踪,因此现在会被跳过并作为警告报告。#9774
-
修复了在仓库级配置目录为空的已复制仓库中读取配置时失败的问题。
-
jj diff和jj status不再忽略合并提交中重命名或复制操作,即使重命名的源文件存在于多个父提交中。之前,为每个父提交报告的相同复制记录被误认为是冲突而被丢弃。#9752 -
jj run不再因 revset 包含冲突提交而崩溃。冲突现在会保留在重写后的提交中。
#9747 -
修复了向 ID 模板函数(
commit_id.short()、commit_id.shortest()等)传递过大的长度参数时导致的崩溃问题。
#9833 -
在协同工作区中,
jj git import和export现在默认被禁用。这些命令通常不执行任何操作,但存在竞态条件。
贡献者
感谢以下人员为本次发布做出的贡献!
- Aaron Bies (@slerpyyy)
- Ada Alakbarova (@ada4a)
- Alexandre Hallaine (@alexandre-hallaine)
- Amaan Qureshi (@amaanq)
- Austin Seipp (@thoughtpolice)
- Caleb White (@calebdw)
- Chawye Hsu (@chawyehsu)
- David Rieber (@drieber)
- Gaëtan Lehmann (@glehmann)
- hexbinoct (@hexbinoct)
- ivelieu (@ivelieu)
- Joseph Lou (@josephlou5)
- Josh McKinney (@joshka)
- Josh Steadmon (@steadmon)
- Kevin Liao (@kevincliao)
- Luna Schwalbe (@lunagl)
- Martin von Zweigbergk (@martinvonz)
- Matt Van Horn (@mvanhorn)
- Nika Layzell (@mystor)
- Niko Savola (@nikosavola)
- Nitzan Raz (@BackSlasher)
- Noah Lev (@camelid)
- OlshaMB(@OlshaMB)
- Philip Metzger(@PhilipMetzger)
- Remo Senekowitsch(@senekor)
- Rob Pilling(@bobrippling)
- Stephen Jennings(@jennings)
- Techcable(@Techcable)
- TogarashiPepper(@TogarashiPepper)
- Vladimir Petrzhikovskii(@0xdeafbeef)
- Waleed Khan(@arxanas)
- Wang Yuantao(@0WD0)
- xtqqczze(@xtqqczze)
- Yash Bavadiya(@xevrion)
- Yuya Nishihara(@yuja)