# jj jj jj jj jj

> Clean Markdown view of GeekNews topic #31008. Use the original source for factual precision when an external source URL is present.

## Metadata

- GeekNews HTML: [https://news.hada.io/topic?id=31008](https://news.hada.io/topic?id=31008)
- GeekNews Markdown: [https://news.hada.io/topic/31008.md](https://news.hada.io/topic/31008.md)
- Type: GN+
- Author: [neo](https://news.hada.io/@neo)
- Published: 2026-07-01T21:02:08+09:00
- Updated: 2026-07-01T21:02:08+09:00
- Original source: [caiustheory.com](https://caiustheory.com/jj-jj-jj-jj-jj/)
- Points: 1
- Comments: 1

## Topic Body

- `jj` 명령어를 반복 입력하는 작은 실수는 **하위 명령 오류**로 이어지지만, `jj` 설정 별칭으로 흡수할 수 있음
- 예시는 현재 편집 중인 changeset의 짧은 ID를 얻으려는 `jj jj show -T 'change_id.short()'`가 실패하는 상황임
- `jj`는 git처럼 설정 파일에 **alias**를 정의할 수 있어, `jj util exec`로 남은 명령을 다시 `jj`에 넘길 수 있음
- 단순 별칭은 `-T`를 실행 대상이 아니라 `jj util exec`의 옵션처럼 해석하므로, `--`로 인자 파싱을 끊어야 함
- 최종 설정 `jj = ["util", "exec", "--", "jj"]`를 쓰면 `jj jj show`뿐 아니라 여러 번 중첩된 `jj jj jj... show`도 같은 changeset ID를 출력함

---

### 반복 입력된 `jj`가 하위 명령 오류로 실패함
- `jj` 사용 중 명령줄에 `jj`를 하나 더 입력하면, 두 번째 `jj`가 하위 명령으로 해석되어 실패함
  - 예시는 현재 편집 중인 changeset의 짧은 ID를 가져오려는 명령임

```sh
$ jj jj show -T 'change_id.short()'
error: unrecognized subcommand 'jj'
Usage: jj [OPTIONS] &lt;COMMAND&gt;
For more information, try '--help'.
```

- 셸 별칭으로도 우회할 수 있지만, `jj` 자체 설정의 **alias**를 사용할 수 있음
  - 설정 편집에는 `jj config edit`를 사용할 수 있음
  - 셸에서 설정을 바꾸려면 `jj config set`을 사용할 수 있음

### `jj util exec`에서 `--`로 인자 전달을 고정함
- 첫 시도는 별칭에서 `jj util exec`로 다시 `jj`를 실행하는 방식임

```toml
[aliases]


# jj all the way down
jj = ["util", "exec", "jj"]
```

- 이 설정에서는 `-T`가 실행 대상 `jj`가 아니라 **`jj util exec`의 옵션**처럼 해석되어 실패함

```sh
$ 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] &lt;COMMAND&gt; [ARGS]...
For more information, try '--help'.
```

- `--`를 넣으면 이후 옵션 파싱을 중단하고 남은 인자를 그대로 실행 대상에 전달할 수 있음

```toml
[aliases]


# jj all the way down
jj = ["util", "exec", "--", "jj"]
```

- 최종 설정 후에는 일반 `jj show`, 중첩된 `jj jj show`, 더 많이 반복된 `jj jj jj ... show`가 모두 같은 짧은 changeset ID를 출력함

```sh
$ 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
```

## Comments



### Comment 60971

- Author: neo
- Created: 2026-07-01T21:02:09+09:00
- Points: 1

###### [Lobste.rs 의견들](https://lobste.rs/s/96kp1m/jj_jj_jj_jj_jj) 
- 이전에도 [git git git git git](https://lobste.rs/s/qrlpqa/git_git_git_git_git)가 있었음

- 이건 더 단순한 방법으로도 가능함:  
  ```  
  [aliases]  
  jj = []  
  ```  
  이 형태의 유일한 단점은, 기억이 맞다면 `jj jj`처럼 다른 인자 없이 실행했을 때 `jj`처럼 **기본 명령**을 실행하지 않는다는 것임
  - 그렇다면 그 더 단순한 방법은 실제로 같은 일을 하는 게 아닌 것 아닌가?

- 와, 거의 1년 전(09/28/25)에 [JJ Discord](https://discord.com/channels/968932220549103686/1420153409268613150/1421934889565032449)에 같은 해결책을 올렸었음  
  `jj jj ...` 오타가 `jj ...`처럼 동작하게 하려면 실제로는 이게 필요함:  
  ```  
  [aliases]  
  jj = ["util", "exec", "--", "jj"]  
  ```  
  사실 이 방식이 꽤 마음에 듦

- 이거 **bunny party** 참조인가?
  - [Chicken Chicken Chicken: Chicken Chicken](https://isotropic.org/papers/chicken.pdf)

- 내가 관리하는 **jj 설정 gist**에도 추가했음: https://gist.github.com/pksunkara/622bc04242d402c4e43c7328234fd01c

- 그래도 Jujutsu가 무엇이고 왜 써야 하는지 **트윗 길이로 5살에게 설명하듯** 정리한 버전을 보고 싶음  
  이전 직장에서는 Git을 4년간 매일 썼고, 정말 싫었음. 우리가 필요로 한 것과 대부분의 사용 방식에 비해 기괴할 정도로 과하게 복잡했고, 대부분에게는 분산 버전 관리 시스템이 아니라 Github 중심의 중앙화된 서버 기반 도구였음  
  많은 Git 사용자가 `git`이 영국 영어로 “성마르고 비협조적이며 도움이 안 되는 사람”이라는 뜻도 있다는 걸 모르는 게 재미있음. 도구로서의 Git을 잘 설명하는 말임  
  다만 다른 버전 관리 시스템은 써본 적이 없어서 비교에는 약함. Jujutsu는 구글링하기도 어렵고, 문서도 나 같은 사람보다는 더 숙련된 버전 관리 사용자에게 맞춰진 듯함
  - Torvalds가 `git`을 고른 건 실제로 **무례하고 성마른 사람**이라는 뜻 때문이었다고 봄
