All of lore.kernel.org
 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 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.