On Sat, Dec 21, 2013 at 3:32 AM, Junio C Hamano <gitster@xxxxxxxxx> wrote: > Duy Nguyen <pclouds@xxxxxxxxx> writes: > >> 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. > > I am not happy with the choice of "main/HEAD" that would squat on a > good name for remote-tracking branch (i.e. s/origin/main/), though. > $GIT_DIR/COMMON_HEAD perhaps? It's not just about HEAD. Anything worktree-specific of the main checkout can be accessed this way, e.g. main/index, main/FETCH_HEAD.... and it's not exactly "common" because it's worktree info. Maybe 1ST_ as the prefix (e.g. 1ST_HEAD, 1ST_index...) ? >> 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. > > I do not understand why you need to go such a route. > > Existing scripts that works only in a real repository will only know > "git rev-parse --git-dir" as the way to get the real GIT_DIR and > would not care about the "common" thing. Scripts updated to work > well with the "common" thing needs to be aware of the "common" thing > anyway, so adding "git rev-parse --common-git-dir" or somesuch that > only these updated knows would be sufficient, no? It simplifies the changes, if the new script is to work with both old and new git versions it may have to write DIR=`git rev-parse --git-common-dir 2>/dev/null || git rev-parse --git-dir` the env way makes it DIR=`GIT_COMMON_DIR=1 git rev-parse --git-dir` -- Duy -- To unsubscribe from this list: send the line "unsubscribe git" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html