3 ms·
Sorry git worktrees are a waste of time Just keep multiple copies of the repo
by hyfgfh 16d ago
Sorry git worktrees are a waste of time
Just keep multiple copies of the repo
- dv_dt 16d agoI don't understand why worktrees either, but to each their own. 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. The actual code and clean merges is much more significant than worktrees vs full clones
- menaerus 16d agoWorktrees 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.
- masklinn 16d agoThey 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. 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.
- drdexebtjl 16d agoHardlinks are the wrong abstraction. You modify one copy and it changes on all linked paths. You want reflinks instead. edit: spellchecker corrected reflinks, this is what I meant.
- koiueo 16d agoI believe you're wrong here. If you modify a hardlinked file, the FS will create new inodes under the hood, leaving existing ones intact. So it's like CoW. At least on ext4. // Didn't double-check, but I've held this belief for over decade now, would be surprised to be proven wrong
- dreamcompiler 16d agoChanging a hardlinked file changes it everywhere, unless your specific editor happens to create a new inode. Thus it depends on your editor. CoW is similar except the new inode is created by the file system itself and is independent of the editor.
- epcoa 16d agoNo this is completely incorrect. The filesystem doesn’t break a link just if you open it. Your editor or higher level utility is free to do so (by unlinking and copying the data into a new file/inode), but this is not how the filesystem works.
- drdexebtjl 16d agoYou're about to be very surprised! echo old > a ln a b echo new > a cat a b # prints "new" and "new" Some programs like GNU sed [1] do create new inodes, but that is a property of the application, not the filesystem: echo old > a ln a b sed -i 'c new' a cat a b # prints "new" and "old" With reflinks in a CoW filesystem the inodes are different from the start, but share the same underlying blocks: echo old > a cp --reflink=always a b ls -i a b # prints different inodes echo new > a cat a b # prints "new" and "old" [1] https://www.gnu.org/software/sed/manual/html_node/Command_002dLine-Options.html#index-_002di https://www.gnu.org/software/sed/manual/html_node/Command_00...