# jj로 더 나은 생성 브랜치 이름 만들기

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

## Metadata

- GeekNews HTML: [https://news.hada.io/topic?id=29710](https://news.hada.io/topic?id=29710)
- GeekNews Markdown: [https://news.hada.io/topic/29710.md](https://news.hada.io/topic/29710.md)
- Type: GN+
- Author: [neo](https://news.hada.io/@neo)
- Published: 2026-05-21T06:01:28+09:00
- Updated: 2026-05-21T06:01:28+09:00
- Original source: [ddbeck.com](https://ddbeck.com/notes/jj-git-push-bookmark-template/)
- Points: 1
- Comments: 1

## Topic Body

- **jj**는 Git 호환 버전 관리 시스템으로 익명 브랜치를 권장하지만, Git 저장소에 push하려면 bookmark, 즉 Git 브랜치 이름이 필요함
- 기본 `jj git push --change xyz`는 `push-xyz` 브랜치를 만들며, **change ID** 중심이라 CLI에서는 자연스럽지만 GitHub 목록에서는 작업 내용을 떠올리기 어려움
- `git_push_bookmark` 템플릿을 바꿔 설명 첫 줄을 **slugify()** 로 짧은 slug로 만들고, 뒤에 짧은 change ID를 붙이는 방식으로 개선 가능함
- `jj git push --change ozkspkuyzpwu`는 `add-note-about-jj-bookmark-templates/ozkspkuyzpwu`를 만들어 읽기 쉬움과 **리비전 연결성**을 함께 유지함
- 공유 저장소에서는 `ddbeck/` 같은 namespace를 앞에 붙일 수 있지만, Git 브랜치 이름 규칙이 복잡해 유효하지 않으면 **수동 bookmark** 생성이 필요함

---

### `jj`의 Git push용 브랜치 이름 개선
- `jj`([Jujutsu](https://docs.jj-vcs.dev/latest/))는 Git 호환 버전 관리 시스템이며, 여러 이유로 **익명 브랜치** 사용을 기대하고 권장함
- Git 저장소로 push할 때는 익명 브랜치에도 이름이 필요하며, `jj`에서는 이를 **bookmark**, Git에서는 branch라고 부름
- `jj git push --change xyz`는 ID가 `xyz`인 리비전을 Git 브랜치 `push-xyz`로 push함
- 기본값은 `jj` CLI가 자주 표시하고 사용하는 change ID를 강조한다는 점에서 자연스럽지만, GitHub 웹사이트의 브랜치 목록에서는 `push-xyz`만으로 어떤 작업인지 기억하기 어려움

### 설정 변경 방식
- [template alias](https://docs.jj-vcs.dev/latest/templates/#configuration) `slugify()`를 새로 만들고, `git_push_bookmark` 템플릿이 이를 사용하도록 바꿈
```toml
[template-aliases]
"slugify(str)" = '''
truncate_end(
65,
str.first_line()
.replace(regex:'[^[[:alnum:]].]', '-')
.replace(regex:'-{2,}', '-')
.replace(regex:'\.{2,}', '.')
.replace(regex:'(^-+|-+$)', '')
.lower()
)
'''
[templates]
git_push_bookmark = 'slugify(description) ++ "/" ++ change_id.short()'
```
- `slugify()`는 변경 설명의 첫 줄을 사용해 짧은 [slug](https://en.wikipedia.org/wiki/Clean_URL#Slug) 형태 이름을 만들고, 끝에 짧은 change ID를 붙임
- 예를 들어 `jj git push --change ozkspkuyzpwu`를 실행하면 `add-note-about-jj-bookmark-templates/ozkspkuyzpwu`가 생성됨
- 이 이름은 더 읽기 쉬우면서도 `jj` CLI에 표시되는 **리비전 ID**와의 연결을 유지함
- 다른 사람과 공유하는 저장소에 push한다면, 자신의 브랜치를 별도 namespace 아래에 두도록 템플릿을 바꿀 수 있음
```toml
[templates]
git_push_bookmark = '"ddbeck/" ++ slugify(description) ++ "/" ++ change_id.short()'
```
- Git 브랜치 이름이 항상 안전한지는 보장되지 않음
- Git의 유효한 브랜치 이름 규칙은 [복잡](https://git-scm.com/docs/git-check-ref-format#_description)하며, 템플릿이 유효하지 않은 이름을 만들면 오류가 발생하고 bookmark를 수동으로 만들어야 함

## Comments



### Comment 57952

- Author: neo
- Created: 2026-05-21T06:01:28+09:00
- Points: 1

###### [Lobste.rs 의견들](https://lobste.rs/s/r4xf2n/better_generated_branch_names_with_jj) 
- 커밋 메시지에 **메타데이터를 넣고 활용**하는 방식으로 꽤 잘 쓰고 있음  
  먼저 커밋 설명에서 trailer 값을 쉽게 꺼내는 `trailer_v(key)` 별칭을 만들고, `nushell` 푸시 스크립트에서 `jj log`로 `ticket/topic` 형태의 브랜치 라벨을 구성함  
  예를 들어 커밋 메시지에 `ticket:TKT-123`, `topic:stop-crashing`을 넣어두면, GitHub에 푸시하고 `"Create PR"` 페이지를 여는 스크립트가 그 값을 가져다 씀  
  **Git trailers**는 설명 안에 일관되게 쓸 수 있는 키-값 저장소라 좋지만, 현재 `revset` 언어에서 꺼내 쓰기는 조금 번거로움

- 커밋 메시지나 변경 내용을 바탕으로 브랜치 이름을 **슬러그화**하는 건 로컬 **LLM**이 처리하기 쉬운 영역처럼 느껴짐
  - 굳이 LLM을 쓸 이유가 있나 싶음. 글에 나온 단순 스크립트가 더 가볍고, 아마 더 빠르며, 거의 비슷하게 잘 동작할 것 같음

- 팀원이 `jj`가 자동 생성한 브랜치 이름에 대해 물어본 적이 여러 번 있었음  
  단발성 커밋 브랜치에는 이 방식의 변형을 써볼 생각임

- **change-id 기반 브랜치 이름**이면 완벽하다고 봄. 굳이 바꾸고 싶지 않음  
  이건 끔찍한 코드 리뷰 도구가 요구하는 브랜치 이름일 뿐, 제목이 아님
  - 기본 자동 생성 브랜치 이름도 대체로 만족하지만, 변경 묶음을 푸시해서 PR로 만들 때 각 PR이 어느 브랜치를 대상으로 해야 하는지 헷갈릴 수는 있음  
    PR 생성을 자동화하는 도구로도 해결 가능하겠지만, 이 방식은 단순해서 좋음
  - $JOB에서는 **설명적인 브랜치 이름**을 쓰는 게 관례임
