Regenerate plugins/*/skills/ from plugins/*/.apm/ after the previous four commits, via scripts/sync-plugin-content.sh --all. The mirror is generated output (ADR-0017) that check-plugin-content-sync's pre-push hook diffs against .apm/; nothing here is hand-edited. Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01EeH8SCbcrCAQrtymkNuhKP
4.1 KiB
4.1 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/. Usertk git worktree remove, orrtk git 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 | rtk git worktree add <path> <branch> |
| Create on a new branch | rtk git worktree add -b <branch> <path> |
| Create on the branch named after the path basename | rtk 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 | rtk git worktree add -B <branch> <path> |
| Create a local branch tracking a remote one | rtk 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 | rtk 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 | rtk git worktree list -v, or --porcelain -z to parse |
| Lock or unlock | rtk git worktree lock [--reason <str>] <path> / rtk git worktree unlock <path> |
| Move | rtk git worktree move <from> <to> |
| Remove | rtk git worktree remove <path> |
| Prune stale metadata | rtk git worktree prune --dry-run, then without the flag |
| Repair after a manual move | rtk git worktree repair — in the main worktree if it moved, or inside a linked worktree that moved. rtk 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.rtk 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 rtk git worktree list --porcelain -z. For a single
operation, report its outcome instead — created: true, moved: true,
removed: true.