path: root/contrib/subtree/
diff options
authorJohannes Schindelin <>2021-06-14 12:41:52 (GMT)
committerJunio C Hamano <>2021-06-15 02:38:26 (GMT)
commitf7ee88f1d09ce47b8e12b52a2f19c7867ae10b29 (patch)
treed36da1888f7454daec5433e441defe7eee38fb1f /contrib/subtree/
parentebf3c04b262aa27fbb97f8a0156c2347fecafafb (diff)
subtree: fix the GIT_EXEC_PATH sanity check to work on Windows
In 22d550749361 (subtree: don't fuss with PATH, 2021-04-27), `git subtree` was broken thoroughly on Windows. The reason is that it assumes Unix semantics, where `PATH` is colon-separated, and it assumes that `$GIT_EXEC_PATH:` is a verbatim prefix of `$PATH`. Neither are true, the latter in particular because `GIT_EXEC_PATH` is a Windows-style path, while `PATH` is a Unix-style path list. Let's make extra certain that `$GIT_EXEC_PATH` and the first component of `$PATH` refer to different entities before erroring out. We do that by using the `test <path1> -ef <path2>` command that verifies that the inode of `<path1>` and of `<path2>` is the same. Sadly, this construct is non-portable, according to However, it does not matter in practice because we still first look whether `$GIT_EXEC_PREFIX` is string-identical to the first component of `$PATH`. This will give us the expected result everywhere but in Git for Windows, and Git for Windows' own Bash _does_ handle the `-ef` operator. Just in case that we _do_ need to show the error message _and_ are running in a shell that lacks support for `-ef`, we simply suppress the error output for that part. This fixes Signed-off-by: Johannes Schindelin <> Signed-off-by: Junio C Hamano <>
Diffstat (limited to 'contrib/subtree/')
1 files changed, 4 insertions, 1 deletions
diff --git a/contrib/subtree/ b/contrib/subtree/
index b06782b..3935cea 100755
--- a/contrib/subtree/
+++ b/contrib/subtree/
@@ -5,7 +5,10 @@
# Copyright (C) 2009 Avery Pennarun <>
-if test -z "$GIT_EXEC_PATH" || test "${PATH#"${GIT_EXEC_PATH}:"}" = "$PATH" || ! test -f "$GIT_EXEC_PATH/git-sh-setup"
+if test -z "$GIT_EXEC_PATH" || ! test -f "$GIT_EXEC_PATH/git-sh-setup" || {
+ test "${PATH#"${GIT_EXEC_PATH}:"}" = "$PATH" &&
+ test ! "$GIT_EXEC_PATH" -ef "${PATH%%:*}" 2>/dev/null
echo >&2 'It looks like either your git installation or your'
echo >&2 'git-subtree installation is broken.'