THIS IS A TEST INSTANCE ONLY! REPOSITORIES CAN BE DELETED AT ANY TIME!

Browse Source

Merge branch 'jj/stash-reset-only-toplevel'

"git stash save" lost local changes to submodules, which has been
corrected.

* jj/stash-reset-only-toplevel:
  stash: avoid recursive hard reset on submodules
tags/v2.24.0-rc0
Junio C Hamano 1 month ago
parent
commit
bb52def6da
3 changed files with 43 additions and 3 deletions
  1. +1
    -1
      builtin/stash.c
  2. +1
    -1
      git-legacy-stash.sh
  3. +41
    -1
      t/t3906-stash-submodule.sh

+ 1
- 1
builtin/stash.c View File

@@ -1392,7 +1392,7 @@ static int do_push_stash(const struct pathspec *ps, const char *stash_msg, int q
struct child_process cp = CHILD_PROCESS_INIT;
cp.git_cmd = 1;
argv_array_pushl(&cp.args, "reset", "--hard", "-q",
NULL);
"--no-recurse-submodules", NULL);
if (run_command(&cp)) {
ret = -1;
goto done;


+ 1
- 1
git-legacy-stash.sh View File

@@ -370,7 +370,7 @@ push_stash () {
git diff-index -p --cached --binary HEAD -- "$@" |
git apply --index -R
else
git reset --hard -q
git reset --hard -q --no-recurse-submodules
fi

if test "$keep_index" = "t" && test -n "$i_tree"


+ 41
- 1
t/t3906-stash-submodule.sh View File

@@ -1,6 +1,6 @@
#!/bin/sh

test_description='stash apply can handle submodules'
test_description='stash can handle submodules'

. ./test-lib.sh
. "$TEST_DIRECTORY"/lib-submodule-update.sh
@@ -21,4 +21,44 @@ KNOWN_FAILURE_CHERRY_PICK_SEES_EMPTY_COMMIT=1
KNOWN_FAILURE_NOFF_MERGE_DOESNT_CREATE_EMPTY_SUBMODULE_DIR=1
test_submodule_switch "git_stash"

setup_basic () {
test_when_finished "rm -rf main sub" &&
git init sub &&
(
cd sub &&
test_commit sub_file
) &&
git init main &&
(
cd main &&
git submodule add ../sub &&
test_commit main_file
)
}

test_expect_success 'stash push with submodule.recurse=true preserves dirty submodule worktree' '
setup_basic &&
(
cd main &&
git config submodule.recurse true &&
echo "x" >main_file.t &&
echo "y" >sub/sub_file.t &&
git stash push &&
test_must_fail git -C sub diff --quiet
)
'

test_expect_success 'stash push and pop with submodule.recurse=true preserves dirty submodule worktree' '
setup_basic &&
(
cd main &&
git config submodule.recurse true &&
echo "x" >main_file.t &&
echo "y" >sub/sub_file.t &&
git stash push &&
git stash pop &&
test_must_fail git -C sub diff --quiet
)
'

test_done

Loading…
Cancel
Save