Appearance
Worktree theo slug
Tổng quan
Sửa code trực tiếp trên checkout chính dễ gây hai vấn đề: một bản dở dang chặn tác vụ khác, và hai phiên làm việc ghi đè nhau trên cùng thư mục. wt cô lập mỗi tác vụ vào một worktree git riêng, với branch, port và .env riêng. Checkout chính luôn sạch và chỉ dùng để đọc hoặc giữ record.
Một tác vụ gồm nhiều bước và nhiều lần sửa vẫn chỉ dùng một worktree. Đơn vị của worktree là slug.
Cách hoạt động
Vòng đời một slug, từ tạo worktree đến dọn dẹp
Lệnh tạo worktree đầy đủ:
sh
git fetch origin
zenify wt new <slug> --type feat --base origin/<base>Slug đặt tên cho toàn bộ vòng đời này. Nó trở thành tên branch <user>/<type>/<slug> và tên thư mục worktree. <user> là git config user.name của bạn (ký tự không hợp lệ trong tên branch đổi thành -); chưa đặt user.name thì lấy phần trước @ trong git config user.email. Repo khai user trong worktree.json thì dùng giá trị đó.
Slug có thể bắt đầu bằng mã ticket, ví dụ zen-123-session-timeout (branch <user>/fix/zen-123-session-timeout). Slug lấy mã đầu tiên trong dòng **Việc Plane:** của spec/plan hoặc ## Intent (zen-<a>-…). /znf:ship đọc mã zen-<n> trong tên branch, cộng các mã trong dòng **Việc Plane:**, để đặt ZEN-<a>, ZEN-<b> vào tiêu đề PR; stack nhiều lớp dùng branch <lớp-1>-<N> nên mã vẫn nằm trong mọi branch.
Một plan chia thành nhiều SDD task (Task 1, Task 2, ...). Tất cả task đó dùng chung một worktree. Cấp thêm worktree cho từng task vi phạm quy tắc "một repo, một worktree" mà slug tồn tại để giữ. Gọi zenify wt new lần nữa với cùng slug trong cùng phiên sẽ bị từ chối, kèm dòng cd tới worktree đã mở.
wt new cũng đẩy branch lên origin (trừ hotfix) để việc hiện là đã bắt đầu. wt rm, wt sweep và wt sweep --all xóa branch remote đó chỉ khi đầu branch remote vẫn là commit mà wt new tạo branch ra (chưa ai commit lên đó), nên task chưa làm gì mất luôn branch remote khi bạn dọn tường minh. Phần tự dọn bên trong wt new giữ nguyên branch remote.
Slug bắt đầu bằng zen-<n> (ví dụ zen-123-login) thì wt new báo cho Plane bằng PAT của bạn (PLANE_API_KEY). Backlog và Todo chỉ cho biết việc nằm ngoài hay trong cycle, không cho biết ai giữ, nên kit xử lý hai cột như nhau. Việc ZEN-<n> ở Backlog hoặc Todo mà chưa có ai được giao thì chuyển sang In Progress và thêm bạn vào assignee. Việc ở Backlog hoặc Todo mà chỉ có bạn trong assignee thì chỉ chuyển state; nếu còn người khác cùng trong assignee (watcher hoặc người giữ khác) thì kit không biết ai giữ nên chỉ in cảnh báo, zenie sẽ chuyển khi thấy branch được push. Việc ở Backlog hoặc Todo do người khác giữ, hoặc ở Intake, Done, Cancelled thì chỉ in cảnh báo. Việc đã In Progress trở đi thì không làm gì. Plane lỗi, thiếu PAT hay quá 8 giây không phản hồi cũng chỉ in cảnh báo: worktree vẫn được tạo.
Liên quan
- Base ref, hotfix base, port block:
--baselấy từ đâu và vì sao hotfix khác. - Ba lớp: binary, plugin, knowledge store:
wtlà một phần của lớp binary. - Tham chiếu lệnh:
zenify wt,zenify wt new.
Lưu ý
--anothermở worktree thứ hai trong cùng repo. Dùng cho một yêu cầu thật sự tách biệt, không dùng khi chỉ thấy "việc này hơi khác". Lạm dụng cờ này là cách một slug thành nhiều branch trong một ngày.- Hotfix được miễn quy tắc trên. Base ref của hotfix là base hotfix repo khai (
zenify hotfix baseref, ví dụorigin/main), không phải branch tích hợp, vì production có thể cần sửa ngay giữa lúc bạn đang làm tính năng. zenify wt rm <slug>từ chối xóa worktree chưa có dấu vết merge, trừ khi thêm--force. Bạn có thể gọi thử mà không mất công việc chưa land..worktrees/phải nằm trong.gitignoređã commit, không nằm trong.git/info/exclude. Khai báo cục bộ không đi theo repo, nên đồng nghiệp clone lần đầu sẽ thấy checkout bị bẩn ngay khi chạyzenify wt new.