Currently 'git stash push -u -- <pathspec>' prints the following errors if <pathspec> only matches untracked files: fatal: pathspec 'untracked' did not match any files error: unrecognized input This is because we first clean up the untracked files using 'git clean <pathspec>', and then use a command chain involving 'git add -u <pathspec>' and 'git apply' to clear the changes to files that are in the index and were stashed. As the <pathspec> only includes untracked files that were already removed by 'git clean', the 'git add' call will barf, and so will 'git apply', as there are no changes that need to be applied. Fix this by making sure to only call this command chain if there are still files that match <pathspec> after the call to 'git clean'. Reported-by: Marc Strapetz <marc.strapetz@xxxxxxxxxxx> Signed-off-by: Thomas Gummerer <t.gummerer@xxxxxxxxx> --- git-stash.sh | 9 ++++++--- t/t3903-stash.sh | 16 ++++++++++++++++ 2 files changed, 22 insertions(+), 3 deletions(-) diff --git a/git-stash.sh b/git-stash.sh index fc8f8ae640..4de9f9bea8 100755 --- a/git-stash.sh +++ b/git-stash.sh @@ -322,9 +322,12 @@ push_stash () { if test $# != 0 then - git add -u -- "$@" | - git checkout-index -z --force --stdin - git diff-index -p --cached --binary HEAD -- "$@" | git apply --index -R + if git ls-files --error-unmatch -- "$@" >/dev/null 2>/dev/null + then + git add -u -- "$@" | + git checkout-index -z --force --stdin + git diff-index -p --cached --binary HEAD -- "$@" | git apply --index -R + fi else git reset --hard -q fi diff --git a/t/t3903-stash.sh b/t/t3903-stash.sh index aefde7b172..8b1a8d2982 100755 --- a/t/t3903-stash.sh +++ b/t/t3903-stash.sh @@ -1096,4 +1096,20 @@ test_expect_success 'stash -- <subdir> works with binary files' ' test_path_is_file subdir/untracked ' +test_expect_success 'stash -u -- <untracked> doesnt print error' ' + >untracked && + git stash push -u -- untracked 2>actual && + test_path_is_missing untracked && + test_line_count = 0 actual +' + +test_expect_success 'stash -u -- <untracked> leaves rest of working tree in place' ' + >tracked && + git add tracked && + >untracked && + git stash push -u -- untracked && + test_path_is_missing untracked && + test_path_is_file tracked +' + test_done -- 2.16.2.804.g6dcf76e11