[Feature Request] Negated non-wildcard patterns in excluded directories in `.gitignore`

From: Joschua Kesper <hidden>
Date: 2025-03-04 19:17:54

Dear Git Community,

I have the somewhat unusual use-case and use negated patterns somewhat
regularly. If I have a path `foo/bar/baz` which I want to track with
git, but don't want any other files in `foo`. I would have to write the
following in the `.gitignore`:

	foo/*
	!foo/bar
	foo/bar/*
	!foo/bar/baz

Instead of the simpler:

	foo
	!foo/bar/baz

In `gitignore(5)` you mention:
It is not possible to re-include a file if a parent directory of that
file is excluded. Git doesn’t list excluded directories for
performance reasons, so any patterns on contained files have no
effect, no matter where they are defined.
This is (I think) due to patterns like `!*.c`.
So I propose changing it so exact-matching pattern parts like `foo` or
`bar` to always work. This could be done by expanding it to the form
mentioned above.

This change wouldn't affect performance I would argue, since writing
`!foo/bar/baz` is pretty unambiguous in what the user intended.
Depending on the implementation it may even improve performance,
since we would only require listing of `foo/bar/baz` and not all of it's
parents (though I am simply guessing the implementation for
`<something>/*` here).

Joschua
Keyboard shortcuts
hback out one level
jnext message in thread
kprevious message in thread
ldrill in
Escclose help / fold thread tree
?toggle this help