Just use copy-on-write clones. They're way more flexible, faster and easier to reason about.<p>I don't get spending all this time on tooling that tries to ease working with worktrees when they're just not the right abstraction for the way we're working now.
You get other things like mutual exclusion, a clean baseline regardless of whats in the main directory, and potentially in the near future a way to tie into lifecycle hooks for eg creation/deletion [1]. That last part is nice in the new agentic AI era where you might want to setup/teardown local services that are isolated to those directories.<p>But yeah the filesystem cost is not ideal. I was just thinking about how to exclude my worktrees from timemachine backups automatically.<p>[1] <a href="https://lore.kernel.org/git/7c8b4673-37ac-45fa-ad8c-a1dc09afe5fe@mtasv.net/" rel="nofollow">https://lore.kernel.org/git/7c8b4673-37ac-45fa-ad8c-a1dc09af...</a>
You are not referring to to a specific git feature, right?<p>You use your filesystem ability to perform a snapshot of your local git repo? Or you do a cp -reflink?<p>How do you handle the exposure of secrets to agents?<p>One thing I like about worktrees is that you get a clean copy (with share git objects though), so you have to copy over what the agent will need, not remove what you don’t want the agent to see.
This sounds really cool, can you explain how you do this?
Assuming you're using a filesystem that supports it like ZFS, Btrfs, XFS, etc, it's as simple as:<p><pre><code> cp -R --reflink=always /path/to/source /path/to/dest
</code></pre>
On macOS with APFS:<p><pre><code> cp -R -c /path/to/source /path/to/dest
</code></pre>
That's it. You get a copy that only stores additional space for metadata, not the files themselves.
do these automatically copy over git config and/or installed hooks?
A slight limitation of worktrees is that you can only have a branch checked out once in all of your worktrees. I guess that's just how git works.<p>But when I want to checkout a branch that's already checked out in another worktree, Magit just plain refuses. I wish it would offer me to either:<p>1. Switch to that worktree instead<p>2. Detach head in the other worktree and checkout here<p>Would be such an improvement! No excuses though, I love magit and might as well hack this myself. I'm just bad at elisp.
> I guess that's just how git works.<p>You can use `--force`:<p>> If <branch> does exist, it will be checked out in the new worktree, if it’s not checked out anywhere else, otherwise the command will refuse to create the worktree (unless --force is used).
Or "--ignore-other-worktrees" for "git switch".<p>This leaves things in a weird state though, as modifying the branch from one of the worktrees will effectively change the ref the other is pointing to, but won't update the other's working tree, making it look like it's preparing to revert all the changes that the first worktree made.<p>(obligatory mention of jj, whose workspaces track what state they were snapshotted at, thus never losing what the true diff of a workspace should be, allowing a "jj workspace update-stale" to safely update the working copy with whatever the other workspaces changed (if you change the working copy in parallel to another workspace changing what the workspace points to, you'll get a saved commit of the working copy changes before being updated, which you'll need to squash/rebase wherever those changes were needed))
I wonder what use case there would be to checkout the same branch in multiple worktrees.<p>Or you aren’t saying this is a wanted feature, simply that magit should switch to the worktree (like lazitgit behavior)?
I use grm when I need worktrees, which makes admin a bit easier; <a href="https://github.com/hakoerber/git-repo-manager" rel="nofollow">https://github.com/hakoerber/git-repo-manager</a>
As the author, I have been using worktrees due to AI agents. And I love Magit but didn’t know it handles git worktrees so well! Thanks for letting me know, will start using magit to manage my worktrees immediately.
Sorry git worktrees are a waste of time
Just keep multiple copies of the repo
Worktrees are significantly faster to use and checkout than clones. They also use much less disk space, and obviously commits made in one worktree do not require git plumbing to get them visible in another etc.
They don’t use less disk space as long as you account for that correctly: clones within a file system use hardlinks for the object store, so if you du on a clone it’ll be however many megs / gigs S but if you do that encompassing n such clones they will only use a bit more than S for the object stores. And cross file system you can use “--shared” although that will break the clone if you remove the source (then again the same occurs with worktrees). It’s also not significantly faster: on a fairly hefty monorepo (a few gigs, working copy is 1.2G) a worktree takes 4.76s, a clone takes 4.94. The clone’s .git “is” 3.4G, but that falls to 5.8MB when du-ing both the source repository and the clone. Of course if you create every clone from the base repo it’s going to be slow as fuck and eat all your disk, but you can not do that.<p>The rest I agree with, that objects and branches are shared between worktrees, as well as the repository configuration (e.g. remotes) is why I use worktrees, having to move things around and losing the content when I’d delete the wrong clone is why I stopped using them.
I don't understand why worktrees either, but to each their own.<p>For my purposes, the alternative with just switching branches or if parallelism is needed, full repos and remotes (including local path remotes) is just much more flexible. Clone local, branch it, optionally do anything later: push a branch back to the local repo, push it to a remote, delete local repo done.<p>The actual code and clean merges is much more significant than worktrees vs full clones
To be honest, AI or not, I just don't like to be in the situation where I need multiple checkouts of the same repository. I do it sometimes anyways, but it's not because I'd like to work like that, rather, because something (bad) happened and it needs fixing, and having an extra checkout would help fixing it.<p>Some things that the post indicates as the problems solved by worktrees to me feel like the (quite common) problems of development environment setup. For example, OP uses worktrees to prevent different tools from competing over files in the working directory of their development environment... Well, a <i>better</i> way to run tests is to not run them from the development environment at all: deploy them to wherever they are supposed to run, and run them there.<p>Unfortunately, a lot of tools are designed to run code from "dirty" environment by default, take for instance Python developer's love for "pip install -e" or pytest running code from the source directory by default. But, for one's own sanity, these practices are better avoided. Running from the working directory of the development environment means that you, as a developer, have to remember every detail of the state left by the previous run and reassure yourself that none of those changes matter to your next run... I don't trust myself to remember that.
Worktrees are a must if you work with monorepos or just multiple branches in general. Lack of conventions (or rather the braindead defaults) and having to explicitly type out everything is what hinders adoption the most.<p>I've solved this by running thin bash script wrappers that keep the workflow SVN-like with a root directory that contains per-branch directories and a hidden bare repo).
I think my layout is similar to yours. What do your scripts do?<p>My branches end up in a tree structure (no shit!), and I rebase and merge up stream as changes land. I guess it could be more automated, but the only tedious part is remembering to remove old worktrees and prune the old branches
worktree clone: Basically git clone that initializes a worktree root according to this guide: <a href="https://dev.to/metal3d/git-worktree-like-a-boss-2j1b" rel="nofollow">https://dev.to/metal3d/git-worktree-like-a-boss-2j1b</a><p>worktree add: `git worktree add` that creates a local new branch and a directory with the same name and sets upstream to match; alternatively checks out an existing remote branch.<p>worktree rm: Removes worktree directory, first checking it is in porcelain state. Then prunes them and removes local branch pointers if they match the remote ones.<p>These all are handwritten and probably buggy, but still less prone to errors than typing out `git worktree add -b foo-123-fix-missing-semicolon foo-123-fix-missing-semicolon origin/develop` manually every time. One pass with Claude or Codex would probably do wonders.
There are many uses for worktrees for people who are more than meat proxies:<p><a href="https://stackoverflow.com/questions/31935776/what-would-i-use-git-worktree-for" rel="nofollow">https://stackoverflow.com/questions/31935776/what-would-i-us...</a>
One thing I've desperately wanted from git worktrees is to use reflinking in some way to lower the cost of copies.<p>I just found <a href="https://github.com/josharian/git-cow-worktree" rel="nofollow">https://github.com/josharian/git-cow-worktree</a> that doesn't inspire confidence.
I recently open sourced the worktree wrapper we use at my workplace, which uses reflinking in this way.<p><a href="https://github.com/Applied-Intuition-Open-Source/stol" rel="nofollow">https://github.com/Applied-Intuition-Open-Source/stol</a>
You could try proposing a worktree copy command on the mailing list. Worktrees are currently independent and work off of repositories which may have no existing worktree / working copy at all, let alone one it makes sense to start from, so there is bothing <i>to</i> copy but for dodgy heuristics.
Great name
I'm currently very much on the jujutsu train as the author also mentioned, i do recommend y'all give it a try
Like many of you I also knew what git worktrees were but always found them clunky because you mentally had to manage worktrees AND branches at the same time. That's why I didn't bother using them.<p>A couple of weeks ago I discovered Worktrunk. That's when my whole workflow flipped 180 degrees: I now always use worktrees, love it, will never go back. Worktrunk was the missing piece for me. Very recommended.
> Tools like Claude Code create a worktree for each task, so several agents (or several sessions of the same agent) can work on the same repo in parallel without stepping on each other<p>Isn’t this unsafe and can cause corruption? <a href="https://github.com/kaeawc/auto-worktree/issues/176" rel="nofollow">https://github.com/kaeawc/auto-worktree/issues/176</a>