[ Duh, I sent this just to Junio initially due to a brainfart. Here goes the list also ] Most of the time when I use pathspecs, I just use the bog-standard normal ones, and everything works wonderfully. But then occasionally I want to exclude a directory (usually "drivers/"), and it all works fine, but the syntax for that is just really cumbersome. That's due to two issues: - the magic characters seem to have been chosen to be annoying on purpose - there's an extra "you can't exclude things without having positive patterns" check and both of those are rather nasty. So to explain where I come from, during releases I do things like this: git diff -M --dirstat=2,cumulative v4.10-rc6..v4.10-rc7 and this is literaly why that "dirstat" diff exists - I find this very useful for a project like the kernel that has a good hierarchical directory structure. So the whole dirstat option came about from my statistics gathering (see more explanations in my original commit 7df7c019c ("Add "--dirstat" for some directory statistics"). However, what often happens for the kernel is that a few big subsystems end up dominating the discussion (usually drivers and architecture), and then you want to drill down into everything else to get that part. Long ago, that used to be painful, and I did things like git diff -M --dirstat ... -- $(ls | egrep -v '(drivers)|(arch)') which works, and gives me the dirstat for stuff that isn't arch or driver updates. However, git actually added exclude patterns, and I don't need to do that crazy thing with shell expansion any more. Now I can do this crazy thing with git natively instead: git diff -M --dirstat .. -- ':!drivers' ':!arch' . but honestly, the git native interface really isn't much simpler than what I used to do. Is there really any reason for requiring the '.'? [ Clarification from original message, since Junio asked: I didn't actually want the semantics of '.' at all, since in a subdirectory it limits to the current subdirectory. So I'd suggest that in the absense of any positive pattern, there is simply no filtering at all, so whenever I say '.' as a pattern, I really meant ":(top)." which is even more of a cumbersom syntax that the current model really encourages. Crazy. Since I tend to always work in the top directory, the two are the same for me ] And did we really have to pick such annoying characters that we need the shell escaping? (I never use the other ones with long forms, but they have the same issue: parenthesis need escaping too, so you have to write them as ':(exclude,icase)drivers' and you have to remember that a final colon is *not* allowed, and they still need the escaping). It really isn't all that wonderful to use from the command line. In revisions, we use "^" for negation, partly exactly because '!' is such a nasty character for shell users. With exclusion being the only case I particularly use, I'd like that for pathspecs too, but maybe others use icase etc? IOW, what I'd like to do is just git diff -M --dirstat .. ^drivers ^arch without needing the ugly quoting, and without needing the pointless positive 'match everything else' marker. Or even just allowing ^ in addition to ! for negation, and otherwise keeping the current syntax. [ Clarification from original message, since Junio asked: yes, this suggestion still assumes the "don't need to specify the positive pattern", so you could just do git diff :^drivers to avoid the drivers directory ] Comments? Other ideas? This is certainly not a high priority, but I hit it once again when doing the 4.10-rc7 statistics, which is why I bring up the discussion.. Linus