git/list[1] front-page[2] threads[3] people[4] search[5] about
 

Re: [PATCH v2 00/21] Support multiple worktrees

From
Duy Nguyen <pclouds@gmail.com>
Date
Dec 19, 2013, 14:12 UTC
Message-ID
<CACsJy8BV6uerMyHNHviL0Jy8s+_jca8NM-hVfnM=u4cr-=JX1Q@mail.gmail.com>

I've got a better version [1] that fixes everything I can think of (there's still some room for improvements). I'm going to use it a bit longer before reposting again. But here's its basic design without going down to code

New .git file format includes two lines: -- 8< -- gitid: <id> gitdir: <path> -- 8< --

Which would set $GIT_COMMON_DIR to <path> and $GIT_DIR to <path>/repos/<id>. Repository split is the same as before, worktree stuff in $GIT_DIR, the rest in $GIT_COMMON_DIR. This .git file format takes precedence over core.worktree but can still be overriden with $GIT_WORK_TREE. The main interface to create new worktree is "git checkout --to".

"repos" belongs to $GIT_COMMON_DIR (i.e. shared across all checkouts). The new worktrees (which I call "linked checkouts") can also access HEAD of the original worktree via a virtual path "main/HEAD". This makes it possible for a linked checkout to detach HEAD of the main one.

There are three entries in repos/<id>: "gitdir" should point to the .git file that points it back here. Every time a linked checkout is used, git should update mtime of this "gitdir" file to help pruning. It should update the file content too if the repo is moved. "link" is a hardlink to .git file, if supported, again for pruning support. "locked", if exists, means no automatic pruning (e.g. the linked checkout is on a portable device).

The interesting thing is support for third party scripts (or hooks, maybe) so that they could work with both old and new git versions without some sort of git version/feature detection. Of course old git versions will only work with ordinary worktrees. To that end, "git rev-parse --git-dir" behavior could be changed by two environment variables. $GIT_ONE_PATH makes 'rev-parse --git-dir' return the .git _file_ in this case, which makes it much easier to pass the repo's checkout view around with "git --git-dir=... ".$GIT_COMMON_DIR_PATH makes 'rev-parse --git-dir' return $GIT_COMMON_DIR if it's from a linked checkout, or $GIT_DIR otherwise. This makes 'rev-parse --git-dir' falls back safely when running using old git versions. The last patch in [1] that updates git-completion.bash could demonstrate how it's used.

[1] https://github.com/pclouds/git.git checkout-new-worktree
-- 
Duy
Next: Junio C Hamano
Message 1 of 7 in “Re: [PATCH v2 00/21] Support multiple worktrees”
  1. Duy NguyenDec 19, 2013
  2. Junio C HamanoDec 20, 2013
  3. Duy NguyenDec 21, 2013
  4. Junio C HamanoDec 22, 2013
  5. Duy NguyenDec 22, 2013
  6. Junio C HamanoDec 26, 2013
  7. Duy NguyenDec 28, 2013

Read the whole thread, see it on lore, or plain text.

$ cat FOOTERMessages come from the public archive at lore.kernel.org/git, fetched every hour. The front page is chosen and written each morning by an AI editor and can be wrong; the threads themselves are the record. About and API. For agents: an MCP server at https://gitlist.dev/mcp, and any thread, story or person page as Markdown by adding .md to its URL (or sending Accept: text/markdown). Details in /llms.txt.