public inbox for git@vger.kernel.org
 help / color / mirror / Atom feed
* Bug: git add :!x . exits with error when x is in .gitignore
@ 2026-01-31 19:43 Remy D. Farley
  2026-02-02 18:04 ` Tian Yuchen
  0 siblings, 1 reply; 3+ messages in thread
From: Remy D. Farley @ 2026-01-31 19:43 UTC (permalink / raw)
  To: git; +Cc: Remy D. Farley

`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



^ permalink raw reply related	[flat|nested] 3+ messages in thread

end of thread, other threads:[~2026-02-02 21:25 UTC | newest]

Thread overview: 3+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2026-01-31 19:43 Bug: git add :!x . exits with error when x is in .gitignore Remy D. Farley
2026-02-02 18:04 ` Tian Yuchen
2026-02-02 21:25   ` Remy D. Farley

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox