]> git.ipfire.org Git - thirdparty/git.git/commitdiff
stash: avoid recursive hard reset on submodules
authorJakob Jarmar <jakob.j@gmail.com>
Sat, 12 Oct 2019 15:38:29 +0000 (17:38 +0200)
committerJunio C Hamano <gitster@pobox.com>
Tue, 15 Oct 2019 01:34:44 +0000 (10:34 +0900)
git stash push does not recursively stash submodules, but if
submodule.recurse is set, it may recursively reset --hard them. Having
only the destructive action recurse is likely to be surprising
behaviour, and unlikely to be desirable, so the easiest fix should be to
ensure that the call to git reset --hard never recurses into submodules.

This matches the behavior of check_changes_tracked_files, which ignores
submodules.

Signed-off-by: Jakob Jarmar <jakob@jarmar.se>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
builtin/stash.c
git-legacy-stash.sh
t/t3906-stash-submodule.sh

index b5a301f24d7a5f8b0a5f7d51703ca4cf38e2109c..c986c258f25734140e7dd05af35ad4744ef9d2f3 100644 (file)
@@ -1383,7 +1383,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;
index f60e9b3e877b24e42431654e1de19911bdfc4f25..07ad4a545910da5ff5a591c159da292d5101dec3 100755 (executable)
@@ -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"
index d7219d6f8f18868ad901e522715a8195c3d58940..b93d1d74da7b41c51ba483fc015ac56f13799341 100755 (executable)
@@ -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