Skip to content

fix: worktreeのセッションでは、gitだけrtkに書き換えさせない - #83

Merged
Shinogasa merged 4 commits into
mainfrom
fix/rtk-worktree-git
Oct 13, 2026
Merged

Shinogasa merged 4 commits into
mainfrom
fix/rtk-worktree-git

Conversation

@Shinogasa

Copy link
Copy Markdown
Owner

概要

worktreeに閉じ込めたセッションでgitを使えなくなる問題を回避する。linked worktreeでgitの語を含むコマンドだけ、rtkの書き換えを省く。

背景

rtk hook claude は git status を rtk git status に書き換える。Claude Code本体のworktree分離チェックは、書き換えた後のコマンドを見て「rtkが何を実行するか読めない」と判定し、拒否する。そのため、worktreeのセッションでは git status も git commit も通らず、PR #80 のコンフリクトをそのセッションから解けなかった。

上流では既知の不具合で、どれもまだ直っていない(2026-10-13時点)。

見送った案は2つある。rtkの hooks.exclude_commands にgitを足す案は、全セッションでgitがrtkを通らなくなる。worktreeでは書き換えを全コマンドで止める案は、worktreeでrtkが効かなくなる。

主な変更点

  • hooks/rtk-rewrite.py を足した。payloadの cwd から上へ .git を探す。.git がファイルで、gitdir: が worktrees/<名前> を指せばlinked worktreeとみなす。その中でコマンドにgitの語を含むなら、何も出さずに終える。それ以外は rtk hook claude の出力と終了コードをそのまま返す
    • submoduleの .git もファイルだが、modules/ を指すので対象外にした
    • grep git のような語も省く。分離チェックがこれらも拒否するため
    • rtkが無ければ、書き換えずに通す
  • settings.json.template の rtk hook claude を、他のフックと同じ「ファイルが無ければ表示して通す」形に置き換えた。timeoutはClaude Codeの既定と同じ60秒にした
  • 配線のテスト(tests/test_jp_doc_review_wiring.py)から、rtkだけtimeoutを除外していた例外を外した
  • backlogに「上流が直ったらラッパーを外す」項目を足した

テスト

  • tests/test_rtk_rewrite_hook.py(新規)は、偽のrtkをPATHに置き、実物のgitで作ったworktreeとsubmoduleで判定を確かめる
  • bash tests/run.sh --all: 937 passed(a6f3a51 で記録済み)
  • 実物のrtkで確かめた。worktreeの git status は書き換えず無出力になり、本体の git status は rtk git status に書き換わる

マージ後に bash setup.sh --claude を実行して、生成済みの ~/.claude/settings.json に反映する。そのうえで、新しいworktreeセッションで git status が通ることを確かめる。

関連

🤖 Generated with Claude Code

Shinogasa and others added 4 commits October 13, 2026 18:33
Claude Codeのworktree分離チェックが、rtkが書き換えた `rtk git ...` を拒否する
(anthropics/claude-code#99895)。linked worktreeでgitを含むコマンドだけ書き換えを省き、
それ以外は `rtk hook claude` に任せるフックを、テストで先に固定する。

RED: tests.test_rtk_rewrite_hook の9件が、hooks/rtk-rewrite.py が無いため失敗した。
tests.test_jp_doc_review_wiring の2件が、Bashの一覧と、rtkのtimeout欠落で失敗した。

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
hooks/rtk-rewrite.py を足し、settings.json.template の `rtk hook claude` を置き換えた。
cwdがlinked worktree(`.git` がファイルで、gitdirが worktrees/ を指す)で、
コマンドにgitの語を含むときだけ何も出さずに終える。それ以外は `rtk hook claude` の
出力と終了コードをそのまま返す。ファイルが無いブランチへ戻しても止めないよう、
他のフックと同じ形で包み、timeoutはClaude Codeの既定と同じ60秒にした。

GREEN: tests.test_rtk_rewrite_hook、tests.test_jp_doc_review_wiring、
tests.test_missing_hook_files の34件が通った。実物のrtkでも、worktreeの `git status`
は無出力、本体の `git status` は `rtk git status` への書き換えになることを確かめた。

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
ラッパーを入れた理由、見送った2案、上流のissueとPRを残す。
着手条件は、上流のどれかが直ったとき。

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
jp-doc-reviewerの指摘を反映した。長い1文を分け、見送った2案の主語と述語をそろえた。

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant