Git development
 help / color / mirror / Atom feed
From: Phil Sainty <psainty@orcon.net.nz>
To: git@vger.kernel.org
Subject: GIT_WORK_TREE is not exported for post-checkout-hook
Date: Tue, 15 Sep 2026 20:24:31 +1200	[thread overview]
Message-ID: <17f331aef833b34fbddbefd66c330465@orcon.net.nz> (raw)

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).

I have only tested post-checkout-hook, so I do not know if this
applies to other hooks as well.


[System Info]
git version:
git version 2.34.1
cpu: x86_64
no commit associated with this build
sizeof-long: 8
sizeof-size_t: 8
shell-path: /bin/sh
uname: Linux 6.8.0-138-generic #138~22.04.1-Ubuntu SMP PREEMPT_DYNAMIC 
Fri Aug  7 13:43:15 UTC  x86_64
compiler info: gnuc: 11.4
libc info: glibc: 2.35
$SHELL (typically, interactive shell): /bin/bash

             reply	other threads:[~2026-09-15  8:50 UTC|newest]

Thread overview: 3+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2026-09-15  8:24 Phil Sainty [this message]
2026-09-16 21:39 ` GIT_WORK_TREE is not exported for post-checkout-hook Junio C Hamano
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=17f331aef833b34fbddbefd66c330465@orcon.net.nz \
    --to=psainty@orcon.net.nz \
    --cc=git@vger.kernel.org \
    /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 a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox