From: Tian Yuchen Date: Wed, 04 Feb 2026 17:53:05 GMT Subject: Re: [PATCH] fix git add :!x exiting with error when x is in .gitignore Message-ID: <9c5be231-f340-4a97-850e-d43c78b2c889@gmail.com> In-Reply-To: On 2/5/26 00:48, Junio C Hamano wrote: > "Remy D. Farley" writes: > A question that immediately comes to mind is if it is appropriate > for a negated pathspec element to recuse itself like this from the > decision process and let other pathspec elements decide the fate of > the path, or if a negated pathspec element should take a more active > role of saying "no" (no, not by immediately returning 0, but this > loop may have to become a two step process if we wanted to implement > e.g., for the function to yield "yes", it has to match at least one > positive pathspec element and zero negated one, or something like > that). You are right. To illustrate, if we run: git add ignored_file ":!ignored_file" Then following things might happen with the patch: -> For the first item, - Does it match 'exclude'? No. - Does it match 'path'? Yes. - Return 1. -> For the second item, - Is never reached -> Git complain, 'The following paths are ignored: ignored_file.' In other word, it's not the expected silent no-op (returning 0). As you suggested, The loop needs to verify that the path matches at least one positive item AND matches none of the negative items. A possible way to acheive it is: (Notice that we no longer return 1 in the half way) >bool matched_positive = false; > >for (item in pathspec) { > if (item matches patch) { > if (item is exclude) { > return 0; > } else { > matched_positive = true; > } > } >} > >return matched_positive ? 1 : 0; By the way, I think extreme cases like 'git add x :!x' should be added into the test scripts. Regards, Yuchen