git-workflow calls itself a router but named two of the six domains it routes to; the other four appeared nowhere in the file. All six are now named, with a routing table in the always-loaded body. git-submodules lost the foreach shell-variable semantics -- only the bare names survived, though $sm_path and $displaypath differ solely by which directory you are in. The table is back. Its relocated commands had also dropped the rtk git prefix its own SKILL.md mandates; 24 of them are re-prefixed. The wider rtk inconsistency across the plugin stays with #113. Also restores git-commits' body and footers output fields, git-branches' tag/ branch detection commands, git-worktrees' git config --worktree, pc-run's ambiguity fallback, git-remotes' git-history boundary, and git-history's pickaxe triggers. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01EJJrm5YmacbwMdzZpXcoti
4.0 KiB
4.0 KiB
name, description, metadata
| name | description | metadata | |||||
|---|---|---|---|---|---|---|---|
| git-worktrees | Use when working on several branches at once without stashing — manages the full lifecycle of a git worktree. Not ordinary branch switching or checkout -> `git-branches`. Not interactive multi-step git guidance -> `git-workflow`. |
|
Gotchas
- A branch can be checked out in only one worktree at a time.
git worktree addon an already-checked-out branch fails;--forceis the only override, so use it only deliberately. - Never
rm -rfa worktree directory. That strands metadata in$GIT_DIR/worktrees/. Usegit worktree remove, orgit worktree pruneafterwards. - Submodules break worktree support. A worktree containing submodules cannot be moved at all, and needs
--forceto remove. extensions.worktreeConfig = trueis a one-way door. Without it,git config --worktreeerrors; with it, that flag writes to the worktree's ownconfig.worktreefile, andcore.bare/core.worktreeare forced there too. It also breaks older Git. Leave it off unless per-worktree config is needed.
Step 1 — Dispatch
| Operation | Run |
|---|---|
| Create on a branch that already exists locally | git worktree add <path> <branch> |
| Create on a new branch | git worktree add -b <branch> <path> |
| Create on the branch named after the path basename | git worktree add <path> — checks that branch out if it exists, else creates it from HEAD |
| Create and reset an existing branch to HEAD — discards its commits | git worktree add -B <branch> <path> |
| Create a local branch tracking a remote one | git worktree add --track -b <branch> <path> <remote>/<branch> — always correct. git worktree add <path> <branch> expands to exactly this, but only under the conditions in references/worktrees.md |
| Throwaway experiment, no branch | git worktree add -d <path> — detached HEAD |
Never git worktree add <path> <remote>/<branch> |
That ref resolves, so the shortcut never fires and you get a detached HEAD, no branch, no upstream. Commits there go unreachable once HEAD moves, and git push needs an explicit refspec. Use the tracking row above |
| List | git worktree list -v, or --porcelain -z to parse |
| Lock or unlock | git worktree lock [--reason <str>] <path> / git worktree unlock <path> |
| Move | git worktree move <from> <to> |
| Remove | git worktree remove <path> |
| Prune stale metadata | git worktree prune --dry-run, then without the flag |
| Repair after a manual move | git worktree repair — in the main worktree if it moved, or inside a linked worktree that moved. git worktree repair <path>... — from any worktree, naming each moved linked worktree's new path |
If the operation needs anything the table does not carry — the full add flag
table, orphan branches, sparse-checkout, locking for removable media, remote
disambiguation across several remotes, how to name a worktree unambiguously,
worktree config keys, or the worked emergency-fix and PR-review patterns — read
references/worktrees.md.
Gates:
move,remove— the main worktree cannot be moved or removed. Only linked worktrees, the onesgit worktree addcreated, are candidates.add,move,remove— escalate force flags one step at a time.-foverrides a safeguard such as an unclean tree;moveandremoveneed-ffon top of that when the worktree is locked. Confirm with the user before either — both discard state.add— lock at creation, not after.git worktree add --lockis atomic, where add-then-lockleaves a window in which the worktree is unprotected.
Step 2 — Report
worktrees:
- path: <directory-path>
branch: <branch-name>
commit: <short-hash>
locked: <true/false>
lock_reason: <reason or empty>
Derive those fields from git worktree list --porcelain -z. For a single
operation, report its outcome instead — created: true, moved: true,
removed: true.