← 文章 / 开源项目
Lobsters 4小时前 · 2026-08-07 07:11:28 · 0 阅读

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 versionjj log -n 5 -n 10 现在可以正常工作,并且别名或包装器中内置的参数也可以显式给出。可以多次指定的参数(如 --configjj 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 log revset 添加了 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 现在会在当前工作区的工作副本变为不可变时,以及在快照过程中,立即创建一个新的工作副本修订版本。这使得行为更接近 jj 0.42 及更早版本。

  • 如果工作副本包含名称不是有效 UTF-8 的路径,快照操作不再失败。此类路径无法被跟踪,因此现在会被跳过并作为警告报告。#9774

  • 修复了在仓库级配置目录为空的已复制仓库中读取配置时失败的问题。

  • jj diffjj status 不再忽略合并提交中重命名或复制操作,即使重命名的源文件存在于多个父提交中。之前,为每个父提交报告的相同复制记录被误认为是冲突而被丢弃。#9752

  • jj run 不再因 revset 包含冲突提交而崩溃。冲突现在会保留在重写后的提交中。
    #9747

  • 修复了向 ID 模板函数(commit_id.short()commit_id.shortest() 等)传递过大的长度参数时导致的崩溃问题。
    #9833

  • 在协同工作区中,jj git importexport 现在默认被禁用。这些命令通常不执行任何操作,但存在竞态条件。

贡献者

感谢以下人员为本次发布做出的贡献!

原始来源: Lobsters

评论 (0)