All of lore.kernel.org
 help / color / mirror / Atom feed
From: Junio C Hamano <gitster@pobox.com>
To: Phil Sainty <psainty@orcon.net.nz>
Cc: git@vger.kernel.org
Subject: Re: GIT_WORK_TREE is not exported for post-checkout-hook
Date: Wed, 16 Sep 2026 14:39:49 -0700	[thread overview]
Message-ID: <xmqqqzisvpsq.fsf@gitster.g> (raw)
In-Reply-To: <17f331aef833b34fbddbefd66c330465@orcon.net.nz> (Phil Sainty's message of "Tue, 15 Sep 2026 20:24:31 +1200")

Phil Sainty <psainty@orcon.net.nz> writes:

> I have a post-checkout-hook shell script which indirectly calls
> "git rev-parse --show-toplevel", and I've found that when that hook
> runs for a checkout within a worktree directory, GIT_DIR is set but
> GIT_WORK_TREE is not set, which leads to the CWD being returned
> instead of the genuine toplevel value.
>
> The script is seeing a GIT_DIR value like this:
>
>      GIT_DIR=/path/to/repo/.git/worktrees/name
>
> The only other git variables in the environment are GIT_EXEC_PATH
> and GIT_PREFIX.
>
> The outcome I'm seeing is explained by
> https://git-scm.com/book/en/v2/Git-Internals-Environment-Variables#_repository_locations
> which says:
>
>      "If --git-dir or GIT_DIR is specified but none of --work-tree,
>      GIT_WORK_TREE or core.worktree is specified, the current working
>      directory is regarded as the top level of your working tree."
>
> The current githooks(5) man page talks about this somewhat:
>
>      "Environment variables, such as GIT_DIR, GIT_WORK_TREE, etc., are
>      exported so that Git commands run by the hook can correctly locate
>      the repository.  If your hook needs to invoke Git commands in a
>      foreign repository or in a different working tree of the same
>      repository, then it should clear these environment variables so
>      they do not interfere with Git operations at the foreign
>      location."
>
> Unsetting GIT_DIR certainly fixes the problem, but I don't think that
> ought to be necessary in my case, as my hook script is calling git in
> the *same* working copy where the checkout happens.  It is not dealing
> with "a foreign" repository [or] a different working tree".
>
> My impression is that GIT_WORK_TREE should also be set for this hook
> when dealing with a worktree.  I have tested this in git version 2.34
> and 2.55 (maint) and also 2.56.0.rc0.355.g945ea7012d (next).

That certainly would be a possible workaround.  I do not know why we
need to export GIT_DIR in the first place, though.

The attached patch would export GIT_WORK_TREE when worktree exists
and GIT_DIR would also be exported, but there is a large NEEDSWORK
comment in the precontext of the hunk, which merits consideration
before moving forward.

 setup.c | 5 ++++-
 1 file changed, 4 insertions(+), 1 deletion(-)

diff --git c/setup.c w/setup.c
index 0d157ac254..d0c0b2f68a 100644
--- c/setup.c
+++ w/setup.c
@@ -2064,8 +2064,11 @@ const char *setup_git_directory_gently(struct repository *repo, int *nongit_ok)
 	    startup_info->have_repository ||
 	    /* GIT_DIR_EXPLICIT */
 	    getenv(GIT_DIR_ENVIRONMENT)) {
-		if (discovery.worktree)
+		if (discovery.worktree) {
 			set_git_work_tree(repo, discovery.worktree);
+			if (discovery.gitdir || getenv(GIT_DIR_ENVIRONMENT))
+				xsetenv(GIT_WORK_TREE_ENVIRONMENT, discovery.worktree, 1);
+		}
 
 		if (discovery.gitdir) {
 			apply_and_export_relative_gitdir(repo, discovery.gitdir, 0);

  reply	other threads:[~2026-09-16 21:39 UTC|newest]

Thread overview: 3+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2026-09-15  8:24 GIT_WORK_TREE is not exported for post-checkout-hook Phil Sainty
2026-09-16 21:39 ` Junio C Hamano [this message]
2026-09-25  7:11   ` Phil Sainty

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=xmqqqzisvpsq.fsf@gitster.g \
    --to=gitster@pobox.com \
    --cc=git@vger.kernel.org \
    --cc=psainty@orcon.net.nz \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.