From: Josh Triplett Date: Sat, 10 Aug 2013 21:44:55 GMT Subject: git stash takes excessively long when many untracked files present Message-ID: <20130810214453.GA5719@jtriplet-mobl1> [CCing folks involved in the recent "stash-refuse-to-kill" merge.] I keep portions of my home directory in git. I tried to "git stash" some local changes, and it ran for several minutes with no progress. ps showed that it was running "git ls-files --killed", which was taking 100% CPU, and occasionally reading the disk very slowly. strace shows that git ls-files --killed is doing a full recursive enumeration of my entire home directory. That's a Really Bad Idea: ~$ find | wc -l 3248997 ~$ find -type d | wc -l 350680 Not only that, but it also appears to be attempting to stat and open several files in every single directory; for instance: stat(".ccache/1/3/.git", 0x7fff254bc7a0) = -1 ENOENT (No such file or directory) open(".ccache/1/3/.git/HEAD", O_RDONLY) = -1 ENOENT (No such file or directory) stat(".ccache/1/3/.git", 0x7fff254bc770) = -1 ENOENT (No such file or directory) open(".ccache/1/3/.git/packed-refs", O_RDONLY) = -1 ENOENT (No such file or directory) (Yes, in that order.) I see a lot of room for optimization here. Most importantly, git ls-files --killed really doesn't need to look at any directory entry unless something in the index would conflict with it. - Josh Triplett