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