Merge branch 'ps/validate-prefix-in-subtree-split' into next

"git subtree split --prefix=P <commit>" now checks the prefix P
against the tree of the (potentially quite different from the
current working tree) given commit.

* ps/validate-prefix-in-subtree-split:
  subtree: validate --prefix against commit in split
Junio C Hamano 2026-02-22 12:27:57 -08:00
commit f44d607586
2 changed files with 31 additions and 0 deletions

View File

@ -257,6 +257,9 @@ main () {
test -e "$arg_prefix" &&
die "fatal: prefix '$arg_prefix' already exists."
;;
split)
# checked later against the commit, not the working tree
;;
*)
test -e "$arg_prefix" ||
die "fatal: '$arg_prefix' does not exist; use 'git subtree add'"
@ -966,6 +969,12 @@ cmd_split () {
else
die "fatal: you must provide exactly one revision, and optionally a repository. Got: '$*'"
fi

# Now validate prefix against the commit, not the working tree
if ! git cat-file -e "$rev:$dir" 2>/dev/null
then
die "fatal: '$dir' does not exist; use 'git subtree add'"
fi
repository=""
if test "$#" = 2
then

View File

@ -368,6 +368,28 @@ test_expect_success 'split requires path given by option --prefix must exist' '
)
'

test_expect_success 'split works when prefix exists in commit but not in working tree' '
subtree_test_create_repo "$test_count" &&
(
cd "$test_count" &&

# create subtree
mkdir pkg &&
echo ok >pkg/file &&
git add pkg &&
git commit -m "add pkg" &&
good=$(git rev-parse HEAD) &&

# remove it from working tree in later commit
git rm -r pkg &&
git commit -m "remove pkg" &&

# must still be able to split using the old commit
git subtree split --prefix=pkg "$good" >out &&
test -s out
)
'

test_expect_success 'split rejects flags for add' '
subtree_test_create_repo "$test_count" &&
subtree_test_create_repo "$test_count/sub proj" &&