@@ -411,8 +411,9 @@ test_expect_success 'split sub dir/ with --rejoin' '
411411 git fetch ./"sub proj" HEAD &&
412412 git subtree merge --prefix="sub dir" FETCH_HEAD &&
413413 split_hash=$(git subtree split --prefix="sub dir" --annotate="*") &&
414- git subtree split --prefix="sub dir" --annotate="*" --rejoin &&
415- test "$(last_commit_subject)" = "Split ' \' ' sub dir/' \' ' into commit ' \' ' $split_hash' \' ' "
414+ git subtree split --prefix="sub dir" --annotate="*" -b spl --rejoin &&
415+ test "$(last_commit_subject)" = "Split ' \' ' sub dir/' \' ' into commit ' \' ' $split_hash' \' ' " &&
416+ test "$(git rev-list --count spl)" -eq 5
416417 )
417418'
418419
@@ -442,18 +443,25 @@ test_expect_success 'split with multiple subtrees' '
442443 git -C "$test_count" subtree add --prefix=subADir FETCH_HEAD &&
443444 git -C "$test_count" fetch ./subB HEAD &&
444445 git -C "$test_count" subtree add --prefix=subBDir FETCH_HEAD &&
446+ test "$(git -C "$test_count" rev-list --count main)" -eq 7 &&
445447 test_create_commit "$test_count" subADir/main-subA1 &&
446448 test_create_commit "$test_count" subBDir/main-subB1 &&
447449 git -C "$test_count" subtree split --prefix=subADir \
448- --squash --rejoin -m "Sub A Split 1" &&
450+ --squash --rejoin -m "Sub A Split 1" -b a1 &&
451+ test "$(git -C "$test_count" rev-list --count main..a1)" -eq 1 &&
449452 git -C "$test_count" subtree split --prefix=subBDir \
450- --squash --rejoin -m "Sub B Split 1" &&
453+ --squash --rejoin -m "Sub B Split 1" -b b1 &&
454+ test "$(git -C "$test_count" rev-list --count main..b1)" -eq 1 &&
451455 test_create_commit "$test_count" subADir/main-subA2 &&
452456 test_create_commit "$test_count" subBDir/main-subB2 &&
453457 git -C "$test_count" subtree split --prefix=subADir \
454- --squash --rejoin -m "Sub A Split 2" &&
458+ --squash --rejoin -m "Sub A Split 2" -b a2 &&
459+ test "$(git -C "$test_count" rev-list --count main..a2)" -eq 2 &&
460+ test "$(git -C "$test_count" rev-list --count a1..a2)" -eq 1 &&
455461 test "$(git -C "$test_count" subtree split --prefix=subBDir \
456- --squash --rejoin -d -m "Sub B Split 1" 2>&1 | grep -w "\[1\]")" = ""
462+ --squash --rejoin -d -m "Sub B Split 1" -b b2 2>&1 | grep -w "\[1\]")" = "" &&
463+ test "$(git -C "$test_count" rev-list --count main..b2)" -eq 2 &&
464+ test "$(git -C "$test_count" rev-list --count b1..b2)" -eq 1
457465'
458466
459467# When subtree split-ing a directory that has other subtree
477485 test_path_is_file subA/file1.t &&
478486 test_path_is_file subA/subB/file2.t &&
479487 git subtree split --prefix=subA --branch=bsplit &&
488+ test "$(git rev-list --count bsplit)" -eq 2 &&
480489 git checkout bsplit &&
481490 test_path_is_file file1.t &&
482491 test_path_is_file subB/file2.t &&
489498 --prefix=subA/subB mksubtree &&
490499 test_path_is_file subA/subB/file3.t &&
491500 git subtree split --prefix=subA --branch=bsplit &&
501+ test "$(git rev-list --count bsplit)" -eq 3 &&
492502 git checkout bsplit &&
493503 test_path_is_file file1.t &&
494504 test_path_is_file subB/file2.t &&
497507 '
498508done
499509
510+ # Usually,
511+ #
512+ # git subtree merge -P subA --squash f00...
513+ #
514+ # makes two commits, in this order:
515+ #
516+ # 1. Squashed 'subA/' content from commit f00...
517+ # 2. Merge commit (1) as 'subA'
518+ #
519+ # Commit 1 updates the subtree but does *not* rewrite paths.
520+ # Commit 2 rewrites all trees to start with `subA/`
521+ #
522+ # Commit 1 either has no parents or depends only on other
523+ # "Squashed 'subA/' content" commits.
524+ #
525+ # For merge without --squash, subtree produces just one commit:
526+ # a merge commit with git-subtree trailers.
527+ #
528+ # In either case, if the user rebases these commits, they will
529+ # still have the git-subtree-* trailers… but will NOT have
530+ # the layout described above.
531+ #
532+ # Test that subsequent `git subtree split` are not confused by this.
533+ test_expect_success ' split with rebased subtree commit' '
534+ subtree_test_create_repo "$test_count" &&
535+ (
536+ cd "$test_count" &&
537+ test_commit file0 &&
538+ test_create_subtree_add \
539+ . mksubtree subA file1 --squash &&
540+ test_path_is_file subA/file1.t &&
541+ mkdir subB &&
542+ test_commit subB/bfile &&
543+ git commit --amend -F - <<' EOF' &&
544+ Squashed ' \' ' subB/' \' ' content from commit ' \' ' badf00da911bbe895347b4b236f5461d55dc9877' \' '
545+
546+ Simulate a cherry-picked or rebased subtree commit.
547+
548+ git-subtree-dir: subB
549+ git-subtree-split: badf00da911bbe895347b4b236f5461d55dc9877
550+ EOF
551+ test_commit subA/file2 &&
552+ test_commit subB/bfile2 &&
553+ git commit --amend -F - <<' EOF' &&
554+ Split ' \' ' subB/' \' ' into commit ' \' ' badf00da911bbe895347b4b236f5461d55dc9877' \' '
555+
556+ Simulate a cherry-picked or rebased subtree commit.
557+
558+ git-subtree-dir: subB
559+ git-subtree-mainline: aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
560+ git-subtree-split: badf00da911bbe895347b4b236f5461d55dc9877
561+ EOF
562+ git subtree split --prefix=subA --branch=bsplit &&
563+ git checkout bsplit &&
564+ test_path_is_file file1.t &&
565+ test_path_is_file file2.t &&
566+ test "$(last_commit_subject)" = "subA/file2" &&
567+ test "$(git rev-list --count bsplit)" -eq 2
568+ )
569+ '
570+
500571test_expect_success ' split sub dir/ with --rejoin from scratch' '
501572 subtree_test_create_repo "$test_count" &&
502573 test_create_commit "$test_count" main1 &&
0 commit comments