Subject: Re: [PATCH v2 22/32] checkout: support checking out into a new working directory

From: Marc Branchaud <[email-masked]>
Date: Thu, 11 Sep 2014 11:02:36 -0400

On 14-09-10 06:41 PM, Nguyễn Thái Ngọc Duy wrote:
> "git checkout --to" sets up a new working directory with a .git file
> pointing to $GIT_DIR/worktrees/<id>. It then executes "git checkout"
> again on the new worktree with the same arguments except "--to" is
> taken out. The second checkout execution, which is not contaminated
> with any info from the current repository, will actually check out and
> everything that normal "git checkout" does.
> 
> Signed-off-by: Nguyễn Thái Ngọc Duy <[email-masked]>
> ---
>  Documentation/git-checkout.txt         | 43 +++++++++++++++
>  Documentation/git.txt                  |  3 +-
>  Documentation/gitrepository-layout.txt |  7 +++
>  builtin/checkout.c                     | 95 +++++++++++++++++++++++++++++++++-
>  path.c                                 |  2 +-
>  t/t2025-checkout-to.sh (new +x)        | 63 ++++++++++++++++++++++
>  6 files changed, 209 insertions(+), 4 deletions(-)
>  create mode 100755 t/t2025-checkout-to.sh
> 
> diff --git a/Documentation/git-checkout.txt b/Documentation/git-checkout.txt
> index 33ad2ad..bd0fc1d 100644
> --- a/Documentation/git-checkout.txt
> +++ b/Documentation/git-checkout.txt
> @@ -225,6 +225,13 @@ This means that you can use `git checkout -p` to selectively discard
>  edits from your current working tree. See the ``Interactive Mode''
>  section of linkgit:git-add[1] to learn how to operate the `--patch` mode.
>  
> +--to=<path>::
> +	Check out a branch in a separate working directory at
> +	`<path>`. A new working directory is linked to the current
> +	repository, sharing everything except working directory
> +	specific files such as HEAD, index... See "MULTIPLE CHECKOUT
> +	MODE" section for more information.
> +
>  <branch>::
>  	Branch to checkout; if it refers to a branch (i.e., a name that,
>  	when prepended with "refs/heads/", is a valid ref), then that
> @@ -388,6 +395,42 @@ $ git reflog -2 HEAD # or
>  $ git log -g -2 HEAD
>  ------------
>  
> +MULTIPLE CHECKOUT MODE
> +----------------------
> +Normally a working directory is attached to repository. When "git
> +checkout --to" is used, a new working directory is attached to the
> +current repository. This new working directory is called "linked
> +checkout" as compared to the "main checkout" prepared by "git init" or
> +"git clone". A repository has one main checkout and zero or more
> +linked checkouts.
> +
> +Each linked checkout has a private directory in $GIT_DIR/worktrees in
> +the main checkout, usually named after the base name of the new
> +working directory, optionally with a number added to make it
> +unique. For example, the command `git checkout --to ../test-next next`
> +running with $GIT_DIR=/path/main may create the directory
> +`$GIT_DIR/worktrees/test-next` (or `$GIT_DIR/worktrees/test-next1` if
> +`test-next` is already taken).
> +
> +Within a linked checkout, $GIT_DIR is set to point to this private
> +directory (e.g. `/path/main/worktrees/test-next` in the example) and
> +$GIT_COMMON_DIR is set to point back to the main checkout's $GIT_DIR
> +(e.g. `/path/main`). Setting is done via a .git file located at the
> +top directory of the linked checkout.
> +
> +Path resolution via `git rev-parse --git-path` would use either
> +$GIT_DIR or $GIT_COMMON_DIR depending on the path. For example, the
> +linked checkout's `$GIT_DIR/HEAD` resolve to
> +`/path/main/worktrees/test-next/HEAD` (not `/path/main/HEAD` which is
> +the main checkout's HEAD) while `$GIT_DIR/refs/heads/master` would use
> +$GIT_COMMON_DIR and resolve to `/path/main/refs/heads/master`, which
> +is shared across checkouts.
> +
> +See linkgit:gitrepository-layout[5] for more information. The rule of
> +thumb is do not make any assumption about whether a path belongs to
> +$GIT_DIR or $GIT_COMMON_DIR when you need to directly access something
> +inside $GIT_DIR. Use `git rev-parse --git-path` to get the final path.
> +

Um, didn't you say in [1] that you'd use the text I posted in [2]?

[1] http://article.gmane.org/gmane.comp.version-control.git/256446
[2] http://article.gmane.org/gmane.comp.version-control.git/256323

		M.