From: Patrick Steinhardt <ps@pks.im>
To: me@black-desk.cn
Cc: git@vger.kernel.org,
Kristoffer Haugsbakk <kristofferhaugsbakk@fastmail.com>,
Junio C Hamano <gitster@pobox.com>,
Phillip Wood <phillip.wood@dunelm.org.uk>
Subject: Re: [PATCH v8 2/2] config: add "worktree" and "worktree/i" includeIf conditions
Date: Mon, 13 Jul 2026 13:16:25 +0200 [thread overview]
Message-ID: <alTJCTKR9jOWfgbk@pks.im> (raw)
In-Reply-To: <20260710-includeif-worktree-v8-2-04686d8a616c@black-desk.cn>
On Fri, Jul 10, 2026 at 02:43:30PM +0800, Chen Linxuan via B4 Relay wrote:
> diff --git a/Documentation/config.adoc b/Documentation/config.adoc
> index 15b1a4d59347..1ef72de62f2b 100644
> --- a/Documentation/config.adoc
> +++ b/Documentation/config.adoc
> @@ -146,6 +146,51 @@ refer to linkgit:gitignore[5] for details. For convenience:
> This is the same as `gitdir` except that matching is done
> case-insensitively (e.g. on case-insensitive file systems)
>
> +`worktree`::
> + The data that follows the keyword `worktree` and a colon is used as a
> + glob pattern. If the working directory of the current worktree matches
> + the pattern, the include condition is met.
> ++
> +The worktree location is the path where files are checked out (as returned
> +by `git rev-parse --show-toplevel`). This is different from `gitdir`, which
> +matches the `.git` directory path. In a linked worktree, the worktree path
> +is the directory where that worktree's files are located, not the main
> +repository's `.git` directory.
> ++
> +The pattern uses the same glob syntax as `gitdir` (including `~/`, `./`,
> +`**/`, and trailing-`/` prefix matching). This condition will never match
> +in a bare repository (which has no worktree).
> ++
> +Unlike `gitdir`, the `worktree` condition currently matches only the
> +realpath-resolved worktree location. If the working tree was entered via a
> +symbolic link, a pattern that uses the symbolic-link spelling may not match;
> +use the real path instead.
It might be worth noticing that this is essentially a limitation and
that this limitation may be fixed at a later point in time. But that
alone is not worth a reroll.
> diff --git a/t/t1305-config-include.sh b/t/t1305-config-include.sh
> index f3892578e4ff..4e840dfdb35b 100755
> --- a/t/t1305-config-include.sh
> +++ b/t/t1305-config-include.sh
> @@ -396,4 +396,132 @@ test_expect_success 'onbranch without repository but explicit nonexistent Git di
> test_must_fail nongit git --git-dir=nonexistent config get foo.bar
> '
>
> +# worktree: conditional include tests
> +
> +test_expect_success 'conditional include, worktree bare repo' '
> + git init --bare wt-bare &&
> + (
> + cd wt-bare &&
> + echo "[includeIf \"worktree:/\"]path=bar-bare" >>config &&
> + echo "[test]wtbare=1" >bar-bare &&
> + test_must_fail git config test.wtbare
> + )
> +'
> +
> +test_expect_success 'conditional include, worktree multiple worktrees' '
> + git init wt-multi &&
> + (
> + cd wt-multi &&
> + test_commit initial &&
> + git worktree add -b linked-branch ../wt-linked HEAD &&
> + git worktree add -b prefix-branch ../wt-prefix/linked HEAD
> + ) &&
> + wt_main="$(cd wt-multi && pwd)" &&
> + wt_linked="$(cd wt-linked && pwd)" &&
> + wt_prefix_parent="$(cd wt-prefix && pwd)" &&
> + cat >>wt-multi/.git/config <<-EOF &&
> + [includeIf "worktree:$wt_main"]
> + path = main-config
> + [includeIf "worktree:$wt_linked"]
> + path = linked-config
> + [includeIf "worktree:$wt_prefix_parent/"]
> + path = prefix-config
> + EOF
> + echo "[test]mainvar=main" >wt-multi/.git/main-config &&
> + echo "[test]linkedvar=linked" >wt-multi/.git/linked-config &&
> + echo "[test]prefixvar=prefix" >wt-multi/.git/prefix-config &&
> + echo main >expect &&
> + git -C wt-multi config test.mainvar >actual &&
> + test_cmp expect actual &&
> + test_must_fail git -C wt-multi config test.linkedvar &&
> + test_must_fail git -C wt-multi config test.prefixvar &&
> + echo linked >expect &&
> + git -C wt-linked config test.linkedvar >actual &&
> + test_cmp expect actual &&
> + test_must_fail git -C wt-linked config test.mainvar &&
> + test_must_fail git -C wt-linked config test.prefixvar &&
> + echo prefix >expect &&
> + git -C wt-prefix/linked config test.prefixvar >actual &&
> + test_cmp expect actual &&
> + test_must_fail git -C wt-prefix/linked config test.mainvar &&
> + test_must_fail git -C wt-prefix/linked config test.linkedvar
> +'
> +
> +test_expect_success SYMLINKS 'conditional include, worktree resolves symlinks' '
> + mkdir real-wt &&
> + ln -s real-wt link-wt &&
> + git init link-wt/repo &&
> + (
> + cd link-wt/repo &&
> + # repo->worktree resolves symlinks, so use real path in pattern
> + echo "[includeIf \"worktree:**/real-wt/repo\"]path=bar-link" >>.git/config &&
> + echo "[test]wtlink=2" >.git/bar-link &&
> + echo 2 >expect &&
> + git config test.wtlink >actual &&
> + test_cmp expect actual
> + )
> +'
There should arguably be a test with `test_expect_failure` that shows
that we in theory _want_ to use both the realpath, but also the
symlinked path to resolve this.
In any case, I think this version is good enough. It's a bit sad that we
cannot easily handle symlinked paths right now, but I'd say that this is
acceptable for now. We might fix this eventually, once we have cleaned
up "setup.c" to not modify global state left and right.
Thanks!
Patrick
prev parent reply other threads:[~2026-07-13 11:16 UTC|newest]
Thread overview: 11+ messages / expand[flat|nested] mbox.gz Atom feed top
2026-07-09 2:41 [PATCH v7 0/3] includeIf: add "worktree" condition for matching working tree path Chen Linxuan via B4 Relay
2026-07-09 2:41 ` [PATCH v7 1/3] config: refactor include_by_gitdir() into include_by_path() Chen Linxuan via B4 Relay
2026-07-09 2:41 ` [PATCH v7 2/3] repository: keep a symlink-preserving copy of the worktree path Chen Linxuan via B4 Relay
2026-07-09 10:09 ` Patrick Steinhardt
2026-07-09 2:41 ` [PATCH v7 3/3] config: add "worktree" and "worktree/i" includeIf conditions Chen Linxuan via B4 Relay
2026-07-09 10:09 ` [PATCH v7 0/3] includeIf: add "worktree" condition for matching working tree path Patrick Steinhardt
2026-07-09 20:40 ` Junio C Hamano
2026-07-10 6:43 ` [PATCH v8 0/2] " Chen Linxuan via B4 Relay
2026-07-10 6:43 ` [PATCH v8 1/2] config: refactor include_by_gitdir() into include_by_path() Chen Linxuan via B4 Relay
2026-07-10 6:43 ` [PATCH v8 2/2] config: add "worktree" and "worktree/i" includeIf conditions Chen Linxuan via B4 Relay
2026-07-13 11:16 ` Patrick Steinhardt [this message]
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=alTJCTKR9jOWfgbk@pks.im \
--to=ps@pks.im \
--cc=git@vger.kernel.org \
--cc=gitster@pobox.com \
--cc=kristofferhaugsbakk@fastmail.com \
--cc=me@black-desk.cn \
--cc=phillip.wood@dunelm.org.uk \
/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