1 ポイント 投稿者 GN⁺ 3 시간 전 | 1件のコメント | WhatsAppで共有
  • 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のWebサイトにあるブランチ一覧では 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を手動で作成しなければならない

1件のコメント

 
GN⁺ 3 시간 전
Lobste.rsの意見
  • コミットメッセージにメタデータを入れて活用する方法で、かなりうまく運用している
    まず、コミット説明から trailer の値を簡単に取り出す trailer_v(key) エイリアスを作り、nushell の push スクリプトで jj log を使って ticket/topic 形式のブランチラベルを組み立てている
    たとえばコミットメッセージに ticket:TKT-123topic:stop-crashing を入れておけば、GitHub に push して "Create PR" ページを開くスクリプトがその値を使う
    Git trailers は説明文の中で一貫して使えるキー・バリュー保存領域として便利だが、現状では revset 言語から取り出して使うのが少し面倒

  • コミットメッセージや変更内容をもとにブランチ名をスラッグ化するのは、ローカルのLLMが扱いやすい領域のように感じる

    • わざわざ LLM を使う理由があるのかは疑問。記事にある単純なスクリプトのほうが軽量で、おそらくより高速で、ほぼ同じくらいうまく動くと思う
  • チームメンバーが jj の自動生成ブランチ名について尋ねてきたことが何度かあった
    単発コミット用のブランチには、この方法の派生形を試してみるつもり

  • change-id ベースのブランチ名なら完璧だと思う。わざわざ変えたくない
    これはひどいコードレビュー用ツールが要求するブランチ名にすぎず、タイトルではない

    • デフォルトの自動生成ブランチ名にも概ね満足しているが、変更のまとまりを push して PR にするとき、各 PR をどのブランチに向けるべきか分かりづらくなることはある
      PR 作成を自動化するツールでも解決できるだろうが、この方法はシンプルでよい
    • $JOB では説明的なブランチ名を使うのが慣例だ