bug report: `git stash save -u` deletes directory whose contents are .gitignored
hi,
- git stash save -u deletes a directory, even though the _contents_ of that directory are .gitignored (e.g. "foo/*" in .gitignore). Detailed reproduction below.
- The behaviour is not present when instead .gitignoring the directory itself (e.g. "foo"). This does imo not excuse the behaviour of the described case.
- The behaviour is not present with just git stash save.
- The expected behaviour is: Only files listed in git status are stashed away; other things are left untouched. Potential exception:
empty directories.
- I am aware that git stash save -u is supposed to have semantics involving the equivalent of reset --hard and clean -f. Neither of those expose the directory-deletion behaviour.
additional comments, not directly relevant to this bug:
- both git stash save; git stash pop and git stash save -u; git stash pop should ideally behave as an "identity effect". The latter might affect the index (i.e. have an effect equivalent to git reset or something in that direction). Any other effect / special cases are bad interface design imo. If a differing design was chosen on purpose, i am thankful for pointers on the reasoning.
- no, i luckily did not truely lose files due to the current behaviour.
lennart
----
reproduction:
Quoted 1 line
git init
Initialized empty Git repository in $SOMEDIR/.git/
Quoted 7 lines
mkdir ignore-contents
echo "ignore-contents/*" > .gitignore
git add .gitignore
git commit -m "initial" >/dev/null
touchignore-contents/blah.txt
touch abc.txt
git status
On branch master
Untracked files:
(use "git add <file>..." to include in what will be committed)
abc.txt
nothing added to commit but untracked files present (use "git add" to track)
Quoted 1 line
ls -1a
.
..
abc.txt
.git
.gitignore
ignore-contents
Quoted 1 line
git stash save -u
Saved working directory and index state WIP on master: adc468b initial HEAD is now at adc468b initial
Quoted 1 line
ls -1a
.
..
.git
.gitignore
Quoted 2 lines
git stash pop &>
/dev/null
ls -1a
.
..
abc.txt
.git
.gitignore
Quoted 1 line
git --version
git version 2.6.1