jj로 더 나은 생성 브랜치 이름 만들기
(ddbeck.com)- 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)는 Git 호환 버전 관리 시스템이며, 여러 이유로 익명 브랜치 사용을 기대하고 권장함- Git 저장소로 push할 때는 익명 브랜치에도 이름이 필요하며,
jj에서는 이를 bookmark, Git에서는 branch라고 부름 jj git push --change xyz는 ID가xyz인 리비전을 Git 브랜치push-xyz로 push함- 기본값은
jjCLI가 자주 표시하고 사용하는 change ID를 강조한다는 점에서 자연스럽지만, GitHub 웹사이트의 브랜치 목록에서는push-xyz만으로 어떤 작업인지 기억하기 어려움
설정 변경 방식
- template alias
slugify()를 새로 만들고,git_push_bookmark템플릿이 이를 사용하도록 바꿈
[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 형태 이름을 만들고, 끝에 짧은 change ID를 붙임- 예를 들어
jj git push --change ozkspkuyzpwu를 실행하면add-note-about-jj-bookmark-templates/ozkspkuyzpwu가 생성됨 - 이 이름은 더 읽기 쉬우면서도
jjCLI에 표시되는 리비전 ID와의 연결을 유지함 - 다른 사람과 공유하는 저장소에 push한다면, 자신의 브랜치를 별도 namespace 아래에 두도록 템플릿을 바꿀 수 있음
[templates]
git_push_bookmark = '"ddbeck/" ++ slugify(description) ++ "/" ++ change_id.short()'
- Git 브랜치 이름이 항상 안전한지는 보장되지 않음
- Git의 유효한 브랜치 이름 규칙은 복잡하며, 템플릿이 유효하지 않은 이름을 만들면 오류가 발생하고 bookmark를 수동으로 만들어야 함
댓글과 토론
Lobste.rs 의견들
-
커밋 메시지에 메타데이터를 넣고 활용하는 방식으로 꽤 잘 쓰고 있음
먼저 커밋 설명에서 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에서는 설명적인 브랜치 이름을 쓰는 게 관례임
- 기본 자동 생성 브랜치 이름도 대체로 만족하지만, 변경 묶음을 푸시해서 PR로 만들 때 각 PR이 어느 브랜치를 대상으로 해야 하는지 헷갈릴 수는 있음