jj jj jj jj jj
摘要
一篇博客文章演示了如何通过在 jj 配置文件中创建递归别名,并利用 'util exec --' 传递参数,来修复在 jj 版本控制系统中意外输入 'jj jj' 时出现的错误。
<p><a href="https://lobste.rs/s/96kp1m/jj_jj_jj_jj_jj">评论</a></p>
查看缓存全文
缓存时间: 2026/06/30 23:42
# jj jj jj jj jj 来源:https://caiustheory.com/jj-jj-jj-jj-jj/ 2025-12-23 10:00:00
类似于 `git git git git git`(https://caiustheory.com/git-git-git-git-git/),如果你在使用 `jj`(https://www.jj-vcs.dev/)时不小心在命令行中多打了一个 `jj`,它会报错。在下面这个例子中,我们试图拉取当前正在编辑的变更集的 ID:
```
$ jj jj show -T 'change_id.short()'
error: unrecognized subcommand 'jj'
Usage: jj [OPTIONS] <COMMAND>
For more information, try '--help'.
```
真烦人。现在我们可以在 shell 中通过别名来解决这个问题,但 `jj` 也允许我们在配置中定义别名(和 git 很像!),再结合 `jj util exec`(https://docs.jj-vcs.dev/latest/cli-reference/#jj-util-exec),我们应该能让它轻松地执行余下的命令行。
仔细想想,第一个 `jj` 会被 shell 执行,所以它已经消失了。第二个 `jj` 则会被当作别名来解析,所以它也没了。剩余的参数会传给这个别名,也就是 `["show", "-T", "change_id.short()"]`,如果我们直接执行这些参数,它会报错说无法将 `show` 作为二进制文件运行。我们可以通过让别名执行 `jj` 再加上这些参数来避免这个问题。
把别名放到 jj 的配置文件中(`jj config edit` 对于编辑这些配置非常有用,或者也可以用 `jj config set` 从 shell 中更新),然后测试一下是否生效。
```
[aliases]
# jj 递归到底
jj = ["util", "exec", "jj"]
```
让我们再次尝试最初的嵌套命令,看看能不能看到我们可爱的变更 ID:
```
$ jj jj show -T 'change_id.short()'
error: unexpected argument '-T' found
tip: to pass '-T' as a value, use '-- -T'
Usage: jj util exec [OPTIONS] [ARGS]...
For more information, try '--help'.
```
噢。我们的 `-T` 参数被 `jj util exec` 解析了,而不是被我们正在运行的 `jj` 命令所接收。典型的嵌套参数解析问题,当我们试图调用另一个命令时就会遇到这种问题。
幸运的是,shell/exec 对此有一个解决方案:传递 `--` 作为参数,这样就会停止解析之后的所有参数,原样传递下去。据此,我们可以修改别名,让它先运行 `jj util exec`,然后停止解释后续的任何参数。
```
[aliases]
# jj 递归到底
jj = ["util", "exec", "--", "jj"]
```
现在,无论命令中有多少个嵌套的 `jj`,我们都应该能毫无问题地看到变更 ID 了!
```
$ jj show -T 'change_id.short()'
upvqxuzzvxtx
$ jj jj show -T 'change_id.short()'
upvqxuzzvxtx
$ jj jj jj jj jj show -T 'change_id.short()'
upvqxuzzvxtx
$ jj jj jj jj jj jj jj jj jj jj jj jj jj jj jj jj jj show -T 'change_id.short()'
upvqxuzzvxtx
```
快乐地提交吧。
相似文章
使用 jj 生成更好的分支名称
本文介绍了 jj 版本控制系统的一个模板别名,通过将提交描述转换为 slug 来生成更易读的分支名称,从而改善默认基于变更 ID 的命名方式的可用性。
我们最终没有使用jj的(微不足道的)原因
Gradle解释了为何决定不采用Jujutsu (jj)作为其主要版本控制系统:jj不遵循.gitattributes,导致在Windows上像gradlew.bat这样的文件因行尾不匹配而持续出现虚假修改。他们继续使用git worktree替代。
jj v0.41.0 发布
Jujutsu (jj) v0.41.0 已发布,这款实验性版本控制系统迎来了更新,旨在提升易用性和冲突处理能力。
1jehuang/jcode
jcode 是一个开源编码代理工具,专为多会话工作流设计,资源占用低,提供CLI安装方式,并在性能上优于Claude Code和Cursor Agent等现有代理。
Jujutsu 如何重新思考 Git 的工作副本和冲突模型
Jujutsu (jj) 是一个新的版本控制系统,它重新思考了 Git 的工作副本和冲突模型,在保持完全 Git 兼容性的同时,提供了更一致的工作流程。