1P by GN⁺ 2시간전 | ★ favorite | 댓글 1개
  • jj는 Git 호환 버전 관리 시스템으로 익명 브랜치를 권장하지만, Git 저장소에 push하려면 bookmark, 즉 Git 브랜치 이름이 필요함
  • 기본 jj git push --change xyzpush-xyz 브랜치를 만들며, change ID 중심이라 CLI에서는 자연스럽지만 GitHub 목록에서는 작업 내용을 떠올리기 어려움
  • git_push_bookmark 템플릿을 바꿔 설명 첫 줄을 slugify() 로 짧은 slug로 만들고, 뒤에 짧은 change ID를 붙이는 방식으로 개선 가능함
  • jj git push --change ozkspkuyzpwuadd-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함
  • 기본값은 jj CLI가 자주 표시하고 사용하는 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가 생성됨
  • 이 이름은 더 읽기 쉬우면서도 jj CLI에 표시되는 리비전 ID와의 연결을 유지함
  • 다른 사람과 공유하는 저장소에 push한다면, 자신의 브랜치를 별도 namespace 아래에 두도록 템플릿을 바꿀 수 있음
[templates]
git_push_bookmark = '"ddbeck/" ++ slugify(description) ++ "/" ++ change_id.short()'
  • Git 브랜치 이름이 항상 안전한지는 보장되지 않음
  • Git의 유효한 브랜치 이름 규칙은 복잡하며, 템플릿이 유효하지 않은 이름을 만들면 오류가 발생하고 bookmark를 수동으로 만들어야 함

댓글과 토론

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

  • 커밋 메시지나 변경 내용을 바탕으로 브랜치 이름을 슬러그화하는 건 로컬 LLM이 처리하기 쉬운 영역처럼 느껴짐

    • 굳이 LLM을 쓸 이유가 있나 싶음. 글에 나온 단순 스크립트가 더 가볍고, 아마 더 빠르며, 거의 비슷하게 잘 동작할 것 같음
  • 팀원이 jj가 자동 생성한 브랜치 이름에 대해 물어본 적이 여러 번 있었음
    단발성 커밋 브랜치에는 이 방식의 변형을 써볼 생각임

  • change-id 기반 브랜치 이름이면 완벽하다고 봄. 굳이 바꾸고 싶지 않음
    이건 끔찍한 코드 리뷰 도구가 요구하는 브랜치 이름일 뿐, 제목이 아님

    • 기본 자동 생성 브랜치 이름도 대체로 만족하지만, 변경 묶음을 푸시해서 PR로 만들 때 각 PR이 어느 브랜치를 대상으로 해야 하는지 헷갈릴 수는 있음
      PR 생성을 자동화하는 도구로도 해결 가능하겠지만, 이 방식은 단순해서 좋음
    • $JOB에서는 설명적인 브랜치 이름을 쓰는 게 관례임