From: Hilco Wijbenga Date: Mon, 22 Aug 2011 18:43:25 GMT Subject: Re: [Git 1.7.6.557.gcee4] git stash Message-ID: In-Reply-To: On 22 August 2011 10:15, Brandon Casey wrote: > On 08/22/2011 01:01 AM, Hilco Wijbenga wrote: >> Hi David, >> >> I noticed your very timely change to git stash in the current master >> branch. I tried it but it doesn't behave as I was expecting/hoping. > > It looks like it is actually creating the stash correctly, but it's > just not deleting the ignored directory. > > But, there is a small problem with your command sequence... > >> hilco@centaur ~/tmp/repo repo$ git --version >> git version 1.7.6.557.gcee4 >> hilco@centaur ~/tmp/repo repo$ git init >> Initialized empty Git repository in /home/hilco/tmp/repo/.git/ >> hilco@centaur ~/tmp/repo repo (master #)$ cat >>.gitignore <<- EOF >>>         *.ignore >>>         ignore-dir/ >>> EOF >> hilco@centaur ~/tmp/repo repo (master #%)$ mkdir src >> hilco@centaur ~/tmp/repo repo (master #%)$ touch file.txt src/code.txt >> hilco@centaur ~/tmp/repo repo (master #%)$ git add -A . >> hilco@centaur ~/tmp/repo repo (master #)$ git commit -m '1' >> [master (root-commit) 0fb4106] 1 >>  1 files changed, 2 insertions(+), 0 deletions(-) >>  create mode 100644 .gitignore >>  create mode 100644 file.txt >>  create mode 100644 src/code.txt >> hilco@centaur ~/tmp/repo repo (master)$ touch file-a.ignore src/file-b.ignore >> hilco@centaur ~/tmp/repo repo (master %)$ echo "hello">src/code.txt >> hilco@centaur ~/tmp/repo repo (master *%)$ mkdir ignore-dir >> hilco@centaur ~/tmp/repo repo (master *%)$ touch >> ignore-dir/{file.ignore,file.txt} >> hilco@centaur ~/tmp/repo repo (master *%)$ git status >> # On branch master >> # Changes not staged for commit: >> #   (use "git add ..." to update what will be committed) >> #   (use "git checkout -- ..." to discard changes in working directory) >> # >> #       modified:   src/code.txt >> # >> # Untracked files: >> #   (use "git add ..." to include in what will be committed) >> # >> #       file-a.ignore >> #       ignore-dir/ >> #       src/file-b.ignore >          ^^^^^^^^^^^^^^^^^ > Why are these entries here? My bad. I had a script that ran the commands but I decided to try run them on the CL so I copy-pasted them. That changed the tabs to spaces and ruined .gitignore. >> no changes added to commit (use "git add" and/or "git commit -a") > > if your .gitignore file looks like this: > >   $ cat .gitignore >   *.ignore >   ignore-dir/ > > then why are those items showing up under "Untracked files:" in the call > to git status above?  /methinks something is wrong with your .gitignore > file.  It doesn't matter in this case, since --all will cause stash to > stash the untracked files regardless of whether they are ignored. > >> hilco@centaur ~/tmp/repo repo (master *%)$ git stash --no-keep-index --all >> Saved working directory and index state WIP on master: 0fb4106 1 >> HEAD is now at 0fb4106 1 >> Not removing ignore-dir/ >> hilco@centaur ~/tmp/repo repo (master $%)$ git status >> # On branch master >> # Untracked files: >> #   (use "git add ..." to include in what will be committed) >> # >> #       ignore-dir/ >> nothing added to commit but untracked files present (use "git add" to track) > > Also, in the future it would be nicer if you provided your list of > commands separately, at the beginning, linked together with &&. > This makes it easier to copy/paste into my terminal, rather than > having to extract the commands out from within the body. > Like this (slightly simplified): > >   git --version && >   git init && >   cat <<-\EOF >.gitignore && >        *.ignore >        ignore-dir/ >        EOF >   mkdir src && >   touch file.txt src/code.txt && >   git add . && >   git commit -m 'initial commit' && >   touch file-a.ignore src/file-b.ignore && >   echo "hello" >src/code.txt && >   mkdir ignore-dir && >   touch ignore-dir/{file.ignore,file.txt} && >   git status && >   git stash --all && >   git status || echo 'FAILURE' Noted. Will do. >> So it quite explicitly states "Not removing ignore-dir/". > > That message is from git-clean, and it is the real problem. > >> How do I >> make sure it also stashes the ignore-dir directory? > > It actually did stash the ignore-dir, it just didn't remove it from > the working directory at the end.  Try deleting the ignore-dir by > hand and then applying the stash, ignore-dir and its content should > be recreated. > > Something like this is probably the appropriate fix: > > diff --git a/git-stash.sh b/git-stash.sh > index f4e6f05..a2d4b4d 100755 > --- a/git-stash.sh > +++ b/git-stash.sh > @@ -240,7 +240,7 @@ save_stash () { >                test "$untracked" = "all" && CLEAN_X_OPTION=-x || CLEAN_X_OPTION >                if test -n "$untracked" >                then > -                       git clean --force --quiet $CLEAN_X_OPTION > +                       git clean --force --quiet -d $CLEAN_X_OPTION >                fi > >                if test "$keep_index" = "t" && test -n $i_tree > > Needs tests. I just tried it with the extra -d and it all seems to work beautifully. Should your patch be sent anywhere?