Re: [PATCH 0/2] worktree: copy-on-write creation and shared-branch worktrees
flat view
From: brian m. carlson <hidden>
Date: 2026-06-05 20:08:34
On 2026-06-05 at 18:49:26, Jason Newton via GitGitGadget wrote:
When many worktrees share one repository -- e .g. a fleet of agents each needing an isolated checkout -- "git worktree add" is costly at scale. Objects are shared via the common dir, but the working tree is not: each add rewrites every tracked file, so N worktrees cost N full checkouts of disk and I/O. And a branch can only be checked out in one worktree. Patch 1 adds "git worktree add --reflink": on a copy-on-write filesystem it populates the new worktree by reflinking the current worktree's files and index, then "git reset --hard" rewrites only the paths that differ from . A reflink_file() helper in copy.c uses FICLONE (Linux) and clonefile() (macOS); elsewhere (other filesystems, Windows) it is probed up front and falls back to a normal checkout. Defaulting is via the worktree.reflink config (true/false/auto); --no-reflink overrides.
Windows apparently has CoW functionality if you use ReFS. I believe Git LFS has code to do this and you may be interested in checking it out. Also, how does this work if worktree A is dirty (but `git update-index` and `git status` have not been run) when the reflink occurs? Does B have stale files from the working tree? If not, how do we plan on detecting that? (While I'm curious, this should also be explained in your commit message because we want to know that you have thought about this problem and have a good answer for it.) I was curious as to how this would work with containers, which typically use overlayfs, but some searching reveals that overlayfs does indeed support reflinks. Thanks for the opportunity to learn something new today.
Patch 2 lets a branch be checked out in several worktrees, for parallel work on one checkout. A branch mid-rebase or mid-bisect elsewhere is still refused.
So how does this work if you have two worktrees for the same branch, A and B, and A commits, and then B does? What we don't want to happen is that because B's worktree is not up to date, it effectively reverts the changes that A made when adding objects to the index to commit. (Again, this is a good thing to explain in your commit message, since reviewers will be curious.) My personal approach, if I needed many worktrees of the same commit, would be to create many refs pointing to the same object ID and check those out. `git update-ref` can perform a single ref transaction with many refs, which is especially efficient with reftable. That would avoid the need for multiple checkout support, although I could still see the utility of reflinking if it can be done safely. If that's a solution that you think would be valuable, you could propose it as a FAQ entry or an edit to the manual page, since I'm sure there are other people with your use case. -- brian m. carlson (they/them) Toronto, Ontario, CA
Attachments
- signature.asc [application/pgp-signature] 325 bytes