From: Johannes Schindelin <johannes.schindelin@xxxxxx> 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 keep the original spirit, and hack together something that unbreaks the logic on Windows. A more thorough fix would look at the inode of `$GIT_EXEC_PATH` and of the first component of `$PATH`, to make sure that they are identical, but that is even trickier to do in a portable way. This fixes https://github.com/git-for-windows/git/issues/3260 Signed-off-by: Johannes Schindelin <johannes.schindelin@xxxxxx> --- contrib/subtree/git-subtree.sh | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/contrib/subtree/git-subtree.sh b/contrib/subtree/git-subtree.sh index b06782bc7955..6bd689a6bb92 100755 --- a/contrib/subtree/git-subtree.sh +++ b/contrib/subtree/git-subtree.sh @@ -5,7 +5,13 @@ # Copyright (C) 2009 Avery Pennarun <apenwarr@xxxxxxxxx> # -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 "${PATH#"${GIT_EXEC_PATH}:"}" = "$PATH" && { + # On Windows, PATH might be Unix-style, GIT_EXEC_PATH not + ! type -p cygpath >/dev/null 2>&1 || + test "${PATH#$(cygpath -au "$GIT_EXEC_PATH"):}" = "$PATH" + } +} || ! test -f "$GIT_EXEC_PATH/git-sh-setup" then echo >&2 'It looks like either your git installation or your' echo >&2 'git-subtree installation is broken.' -- gitgitgadget