diff --git a/scripts/task.sh b/scripts/task.sh index 587074dd..f9eadd84 100755 --- a/scripts/task.sh +++ b/scripts/task.sh @@ -63,10 +63,13 @@ cmd_start() { [ "$(git status --porcelain | { grep -v '^.. \.zcode/' || true; } | wc -l)" -eq 0 ] || die "dirty tree — resolve first (precheck verdict BUSY)" [ "$(git submodule status --recursive 2>/dev/null | { grep -cE '^\+|^U' || true; })" -eq 0 ] || die "submodule drift/conflict — resolve first (precheck verdict BUSY)" git merge-base --is-ancestor "origin/${TARGET_BRANCH}" HEAD || die "local ${TARGET_BRANCH} behind origin — pull --ff-only first" - local rmain slug wt + local rmain slug wt mainroot rmain=$(git rev-parse "origin/${TARGET_BRANCH}") slug=$(echo "$name" | tr '/' '-') - wt="$(dirname "$(pwd)")/$(basename "$(pwd)")-wt-${slug}" + # 落点须为主检出的平级目录:$PWD 推算在子目录(或任务 worktree 内)运行时会算错, + # 改用 git-common-dir 的父目录定位主检出(与 cmd_finish 同款惯用法)。 + mainroot=$(dirname "$(cd "$(git rev-parse --git-common-dir)" && pwd)") + wt="$(dirname "$mainroot")/$(basename "$mainroot")-wt-${slug}" [ -e "$wt" ] && die "worktree path exists: $wt" git worktree add -q "$wt" -b "$name" "$rmain" (cd "$wt" && git submodule update --init --recursive >/dev/null 2>&1 || echo "[warn] submodule init incomplete in worktree")