`git add :!x .`, which is executed as part `git stash :!x`, seems to treat pathspec with and without exclude magic the same, exiting with error when "x" is in gitignore file. If file "x" isn't present, `git add x` still exits with error as expected (although with a different one), but `git add :!x .` succeeds.
Git-add manpage doesn't specify that exclude pathspecs are treated anyhow differently from normal ones, so I'm not sure if it's really a bug. But it does seem like one. I originally tried to exclude certain files from scripted stashes using pathspec, but had to switch to reusing core.excludesFile (which is probably a better fit for my use case).
```sh $ sh repro.sh [...] + echo x >.gitignore + echo x >x + git add -- ':!x' . Saved working directory and index state WIP on main: c8a842d Init The following paths are ignored by one of your .gitignore files: x hint: Use -f if you really want to add them. hint: Disable this message with "git config set advice.addIgnoredFile false" + echo exited with code 1 exited with code 1 ```
```sh # repro.sh rm -rf repro; mkdir repro; cd repro trap 'echo exited with code $?' EXIT set -euo pipefail -o xtrace
git init git commit -m Init --allow-empty
# If we comment out either of the following lines, git add/stash commands below succeed echo x >.gitignore echo x >x
# Git add . is executed as part of git stash, as can be seen using strace -ffeexecve git add -- ":!x" . # fails # git stash --include-untracked -- ":!x" # fails
echo ok ```
--- dir.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/dir.c b/dir.c index b00821f2..0026bd65 100644 --- a/dir.c +++ b/dir.c @@ -2264,7 +2264,7 @@ static int exclude_matches_pathspec(const char *path, int pathlen, { int i; - if (!pathspec || !pathspec->nr) + if (!pathspec || !pathspec->nr || pathspec->magic & PATHSPEC_EXCLUDE) return 0; GUARD_PATHSPEC(pathspec,
-- 2.51.2