Before 82dce99 (attr: more matching optimizations from .gitignore,
2012-10-15), .gitattributes did not have any special treatment of a
leading '!'.  The docs, however, always said

  The rules how the pattern matches paths are the same as in
  `.gitignore` files; see linkgit:gitignore[5].

By those rules, leading '!' means pattern negation.  So 82dce99
correctly determined that this kind of line makes no sense and should
be disallowed.

However, users who actually had a rule for files starting with a '!'
are in a bad position: before 82dce99 '!' matched that literal
character, so it is conceivable that users have .gitattributes with
such lines in them.  After 82dce99 the unescaped version was
disallowed in such a way that git outright refuses to run(!) most
commands in the presence of such a .gitattributes.  It therefore
becomes very hard to fix, let alone work with, such repositories.

Let's at least allow the users to fix their repos: change the fatal
error into a warning.

Signed-off-by: Thomas Rast <>
 attr.c                | 8 +++++---
 t/ | 3 ++-
 2 files changed, 7 insertions(+), 4 deletions(-)

diff --git a/attr.c b/attr.c
index 4657cc2..e2f9377 100644
--- a/attr.c
+++ b/attr.c
@@ -255,9 +255,11 @@ static struct match_attr *parse_attr_line(const char 
*line, const char *src,
-               if (res->u.pat.flags & EXC_FLAG_NEGATIVE)
-                       die(_("Negative patterns are forbidden in git 
-                             "Use '\\!' for literal leading exclamation."));
+               if (res->u.pat.flags & EXC_FLAG_NEGATIVE) {
+                       warning(_("Negative patterns are ignored in git 
+                                 "Use '\\!' for literal leading 
+                       return NULL;
+               }
        res->is_macro = is_macro;
        res->num_attr = num_attr;
diff --git a/t/ b/t/
index 43b2513..0b98b6f 100755
--- a/t/
+++ b/t/
@@ -198,7 +198,8 @@ test_expect_success 'root subdir attribute test' '
 test_expect_success 'negative patterns' '
        echo "!f test=bar" >.gitattributes &&
-       test_must_fail git check-attr test -- f
+       git check-attr test -- '"'"'!f'"'"' 2>errors &&
+       test_i18ngrep "Negative patterns are ignored" errors
 test_expect_success 'patterns starting with exclamation' '

To unsubscribe from this list: send the line "unsubscribe git" in
the body of a message to
More majordomo info at

Reply via email to