git-worktree

gwtgit worktree を簡単に扱うための CLI。新しい worktree を作るとき、 .gitignore で無視される .envnode_modules/ などのローカルファイルも自動でコピーする。 swt は Superset 向けの worktree CLI で、GitHub Issue / PR から worktree とタスクファイルを作り、 必要に応じて Superset workspace 登録や AI エージェント起動まで行う。

Source of truth

このページの原本は TomoakiMizuno/git-worktreeREADME.mddocs/ 配下の設計メモ。CLI のフラグや Superset / Codex の運用詳細は 更新が早いので、最新の正は常に元リポジトリ側にある。内容が古くなったら元リポジトリを読み直して content/git-worktree/index.html を再生成する。

概要

gwt
汎用 git worktree wrapper。ローカル設定ファイルのコピー、worktree の一覧・削除・コマンド実行を扱う。GitHub や Superset に依存しない。
swt
Superset workflow 用 CLI。Issue / PR 起点の worktree 作成、.superset/task-{slug}.md 生成、エージェント起動、Codex App worktree 連携を扱う。Superset sh / Mac 前提。

基本のデータフロー

flowchart TD
        repo["元リポジトリ"]
        gwt["gwt add"]
        wt["新しい worktree
+ .gitignore 対象のコピー"] gh["GitHub Issue / PR"] swt["swt issue / swt pr"] task[".superset/task-{slug}.md"] agent["AI エージェント起動
claude / codex / gemini ..."] superset["Superset / Codex
workspace 連携"] repo --> gwt --> wt gh --> swt --> wt swt --> task --> agent wt --> superset

インストール

Windows を含む汎用の git worktree 用途では gwt だけをインストールする。 swt は Superset sh / Mac 前提の workflow 用 CLI なので、gwt だけを使う場合はインストール対象外。

go install
# 汎用用途は gwt だけ
go install github.com/TomoakiMizuno/git-worktree/cmd/gwt@latest

# Superset workflow も使う場合は swt も
go install github.com/TomoakiMizuno/git-worktree/cmd/swt@latest
make(ソース checkout 時)
make install-gwt   # gwt だけ
make install       # gwt / swt の両方

gwt — worktree を追加する

gwt add
# デフォルトの作成先に worktree を追加
gwt add feature-branch

# 作成先パスを明示
gwt add feature-branch /path/to/worktree

# 新規 branch の起点を指定
gwt add feature-branch --base develop

path を省略すると、作成先は現在のリポジトリルート名に branch 名を連結した隣接パスになる。 例えば /repo/myappgwt add feature-branch を実行すると、通常は /repo/myapp-feature-branch が作成先。 worktree 作成後、元リポジトリで .gitignore により無視されているファイルやディレクトリを新しい worktree へコピーする。

作成先と base branch

gwt add は第 1 引数の branch が既に存在するかを確認し、状況に応じて git worktree add の呼び出しを切り替える。

状況実行される Git 操作--base の扱い
ローカル branch が存在するgit worktree add <path> <branch>使われない
ローカル branch はなく origin/<branch> が存在git worktree add -b <branch> <path> origin/<branch>使われない
ローカル / remote tracking branch がどちらもないgit worktree add -b <branch> <path> <base>新規 branch の起点として使う

--base のデフォルトは main。新規 branch を作る場合だけ、指定したローカル branch または origin/<base> が起点になる。 どちらも見つからない場合は 起点ブランチ "<base>" が見つかりません というエラーで停止する。

gwt — 作業開始前に main を更新する

gwt refresh-main は、現在の worktree を作業開始前に origin/main へ fast-forward する保守的な更新コマンド。 Codex App、Orca、Claude Code などの agent worktree で、tool や hook に依存しない preflight として明示的に呼べる。

gwt refresh-main
# origin/main を fetch し、HEAD がその祖先なら fast-forward
gwt refresh-main

# remote や branch を明示
gwt refresh-main --remote upstream --branch develop

# dirty worktree での実行を明示的に許可
gwt refresh-main --allow-dirty

既定では dirty worktree、diverged HEAD、fetch 失敗、remote branch 不在、fast-forward 失敗で停止する。 --allow-dirty を指定しても stash、自動 rebase、通常 merge、自動 conflict 解決は行わない。

gwt — .worktreeinclude でコピー対象を絞る

gwt add がコピーする対象は、元リポジトリ側で .gitignore に一致したファイルとディレクトリ (.envnode_modules/.vscode/ など)。リポジトリルートに .worktreeinclude を置くと、 .gitignore で無視された候補をさらにホワイトリストで絞り込める。

.worktreeinclude
# 環境変数ファイルだけコピーする
*.env
.env.*

# 特定の設定ディレクトリをコピーする
config/

# Claude 設定をコピーする
**/.claude/*
  • .worktreeinclude が存在しない場合は、従来どおり .gitignore 対象をすべてコピーする。
  • 空、またはコメント行と空行だけの場合は何もコピーされない。
  • パターン形式は .gitignore と同じ。# で始まるコメント行と空行は無視される。
  • ディレクトリがパターンに一致した場合、その配下もコピー対象になる。

gwt — 一覧・削除・コマンド実行

list / remove / exec
# worktree 一覧(path / branch / commit を表示)
gwt list

# fzf で選択して削除
gwt remove
# path を直接指定して削除
gwt remove /path/to/worktree
# branch 名を指定してデフォルト作成先を削除
gwt remove feature-branch

# 選択した worktree path を最後の引数として渡す
gwt exec code
# 選択した worktree をカレントとしてコマンド実行
gwt exec-in make build
Flag動作
--force, -fGit の worktree lock や dirty 状態を含めて強制削除(git worktree remove --force --force 相当)
--delete-branch, -dworktree 削除後に対応するローカル branch も git branch -D で削除。main / master は保護対象

gwt remove / gwt exec / gwt exec-infzf を使う。 シェル補完は gwt completion <shell> で出力でき、対応 shell は bash / zsh / fish / powershellgwt remove <Tab> で worktree path が補完される。

swt — GitHub Issue / PR から worktree を作る

前提条件

swt issue / swt pr は GitHub CLI を使うため、事前に gh をインストールし、対象 repository を読める account で認証しておく (gh auth status)。引数なしで Issue / PR / task を選ぶ場合は fzf を使う。--agentswt task run には起動したい AI エージェント CLI が必要。

swt issue / swt pr
# GitHub Issue から worktree とタスクファイルを作成
swt issue 123
swt issue '#123'
swt issue https://github.com/org/repo/issues/123
swt issue 123 --base develop

# GitHub PR から worktree とタスクファイルを作成
swt pr 456
swt pr 456 --base develop

# worktree 作成後にエージェントを起動し、Draft PR 作成方針を task に埋め込む
swt issue 123 --agent --pr draft

Issue / PR の入力形式は番号、# 付き番号、GitHub URL。現在の repository と違う owner/repo の URL は拒否する。 日本語など ASCII 以外を含む Issue title からは、codex / copilot / claude の順に英訳を試して branch 名 slug を作る。

コマンドbranch 名base branch の扱い
swt issueIssue 番号 + title slug--base の値。省略時は main
swt prPR head branch。fork PR は PR 番号 prefix 付き--base を task に記録。省略時は PR の baseRefName

swt pr--basegit worktree add の起点ではなく、task ファイルに書き込む Base Branch の値。 PR の head ref は fetch され、ローカル branch が無ければ作成される。すでにある場合は未 push コミットが無ければ PR の開始点に同期し、未 push コミットがあるとローカル作業を守るためエラーになる。

swt — タスクファイルとエージェント起動

worktree 作成後、swt.superset/task-{slug}.md を生成する。テンプレートは次の順で探索する。

  1. 新しい worktree の template

    <worktree>/.superset/task-prompt-template.md

  2. 実行元 repository の template

    未 commit の project local template でも反映できる

  3. ホームの template

    ~/.superset/task-prompt-template.md

  4. 組み込みデフォルト

    swt task template > .superset/task-prompt-template.md で出力できる

テンプレートでは {{id}}{{slug}}{{title}}{{description}}{{priority}}{{statusName}}{{labels}}{{prStrategy}}{{baseBranch}} の placeholder を使える。 作成済み task からの再開は swt task run(slug 省略時は .superset/task-*.md を探索)。

swt task run
swt task run                 # 複数 task があれば fzf で選ぶ
swt task run 123-fix-login   # slug を直接指定
swt task run --agent claude

swtclaudecodexgeminiopencodepicopilotcursor-agent を agent 名として扱える。 swt issue / swt pr--agent を値なし指定した場合の既定は claudeswt task run--agent 省略時は codex--danger または SWT_DANGER_MODE=1 で agent 定義の権限バイパス系 flag を付ける。

PR 作成戦略

--pr は task ファイルへ書き込む PR 作成戦略。swt 自体がその場で PR を作るのではなく、task を読んだ agent が作業完了後の方針として使う。

意味既定
draftbranch を push し、Draft PR を作るswt issue の既定
createbranch を push し、通常 PR を作る
nonePR を作らないswt pr の既定

swt — 孤立 worktree をクリーンアップする

swt clean は Superset から削除されたが disk に残っている worktree を検出し、必要に応じて削除する。 Superset 管理の worktree directory 配下だけを対象にし、Superset DB の worktree record に存在しない git worktree を孤立とみなす。 まず --list で削除候補を確認する。

swt clean
swt clean --list          # 削除せず候補だけ表示
swt clean                 # 孤立 worktree を削除
swt clean --delete-branch # local branch も削除
swt clean --force         # 未コミット変更があっても強制削除

Codex App 管理 worktree の record cleanup や stale alias cleanup は swt clean ではなく swt codex unlink-workspace / swt codex prune-links を使う。

Superset / Codex 連携

運用 runbook は元リポジトリが正

Superset workspace 連携と Codex App worktree 連携は MCP / CDP、mode / route、host DB の世代差など実装依存が大きく、更新も早い。 ここでは代表コマンドだけを示す。所有権境界・transport precedence・warning の読み方・手動検証チェックリストは runbook の Superset/Codex 連携Codex hook 連携 を参照する。

swt codex
# Codex hook から現在の Codex worktree を Superset に同期
swt codex sync-current-workspace --quiet

# 同期予定を dry-run で確認
swt codex sync-workspaces --dry-run

# record だけを外す(実体 worktree は残す)
swt codex unlink-workspace --dry-run

# Superset record 起点で古い workspace を監査
swt codex stale-workspaces

# archived thread だけの worktree を cleanup(dry-run -> --apply)
swt codex cleanup-archived-workspaces
コマンド用途実体 worktree の削除
swt codex sync-current-workspace --quiethook から現在の Codex worktree を同期しない
swt codex unlink-workspaceSuperset workspace record だけを外すしない
swt codex stale-workspaces --applythreadless stale worktree の実体削除 / record-only cleanupする
swt codex cleanup-archived-workspaces --applyarchived thread だけの worktree を実体削除する
swt codex check-hooksSessionStart hook と trust / enable 状態を read-only で診断しない

所有権は分離されており、Codex App が作成した実体 worktree の所有者は Codex App。実体 worktree を削除するのは stale-workspaces --apply または cleanup-archived-workspaces --apply を明示した場合だけ。 Codex の SessionStart hook(~/.codex/hooks.json)に swt codex sync-current-workspace --quiet を追加すると、セッション開始時に現在の workspace だけを同期できる。

詳細ドキュメント

参照元

このページは生成物です。原本は元リポジトリ側にあります。