git/list[1] front-page[2] threads[3] people[4] search[5] about
 

Re: .gitattributes override behavior (possible bug, or documentation bug)

From
Jeff King <peff@peff.net>
Date
Mar 20, 2018, 04:04 UTC
Message-ID
<20180320040411.GB12938@sigill.intra.peff.net>
In-Reply-To
<CAHnyXxRcwq40W4tKm=Kscrsnb77yh7=eGDE=r5AZq073MPX9AQ@mail.gmail.com>
On Mon, Mar 19, 2018 at 11:10:26PM -0400, Dakota Hawkins wrote:
Show 6 quoted lines
> > As you noted below, that second line does not match your path, because
> > attributes on a directory aren't applied recursively. And it has nothing
> > to do with overriding. If you remove the png line entirely, you can see
> > that we still do not match it. You need to use "*" to match the paths.
> 
> Ah, yes, I see that. Inconsistent with .gitignore (more below), right?
Yes, it is.
Show 11 quoted lines
> > I could not find anything useful in gitattributes(5). There's some old
> > discussion here:
> >
> >   https://public-inbox.org/git/slrnkldd3g.1l4.jan@majutsushi.net/
> 
> If I follow that correctly: There's some initial speculation that it
> would be OK to apply the attributes recursively, which is then shot
> down because it wasn't designed to be recursive (though I don't see a
> different, technical reason for that), followed by finding a (this
> same?) solution/workaround for the original problem. Is that about
> right?

Right. The technical reason is mostly "that is not how it was designed, and it would possibly break some corner cases if we switched it now".

Show 7 quoted lines
> > I think just "/.readme-docs/**" should be sufficient for your case. You
> > could also probably write "*" inside ".readme-docs/.gitattributes",
> > which may be simpler (you don't need "**" there because patterns without
> > a slash are just matched directly against the basename).
> 
> Wouldn't that make the "*" inside ".readme-docs/.gitattributes",
> technically recursive when "*" matches a directory?

Sort of. The pattern is applied recursively to each basename, but the pattern itself does not match recursively. That's probably splitting hairs, though. :)

Show 5 quoted lines
> It's always seemed to me that both were necessary to explicitly match
> things in a directory and its subdirectories (example, IIRC: "git
> ls-files -- .gitattributes" vs "git ls-files -- .gitattributes
> **/.gitattributes"). Maybe that example is peculiar in that its a
> dotfile and can't have a wildcard before the dot?

Those are pathspecs, which are not quite the same as gitattributes. They don't do the magic basename matching.

For pathspecs a "*" matches across slashes, which is what allows "git log -- '*.h'" to work (but not a suffix wildcard like 'foo*').

> I guess my takeaway is that it would be _good_ if the gitattributes
> documentation contained the caveat about not matching directories
> recursively, but _great_ if gitattributes and gitignore (and whatever
> else there is) were consistent.

I agree it would be nice if they were consistent (and pathspecs, too). But unfortunately at this point there's a maze of backwards compatibility to deal with.

-Peff
Previous: Jeff KingNext: Jeff King
Message 6 of 28 in “.gitattributes override behavior (possible bug, or documentation bug)”
  1. Dakota HawkinsMar 20, 2018
  2. Jeff KingMar 20, 2018
  3. Dakota HawkinsMar 20, 2018
  4. Dakota HawkinsMar 20, 2018
  5. Jeff KingMar 20, 2018
  6. Jeff KingMar 20, 2018
  7. doc/gitattributes: mention non-recursive behaviorJeff King, Mar 20, 2018
  8. Dakota HawkinsMar 20, 2018
  9. Duy NguyenMar 20, 2018
  10. Jeff KingMar 21, 2018
  11. Duy NguyenMar 21, 2018
  12. Jeff KingMar 23, 2018
  13. Dakota HawkinsMar 20, 2018
  14. Jeff KingMar 20, 2018
  15. Dakota HawkinsMar 20, 2018
  16. Duy NguyenMar 20, 2018
  17. Dakota HawkinsMar 21, 2018
  18. Jeff KingMar 21, 2018
  19. Dakota HawkinsMar 21, 2018
  20. Dakota HawkinsMar 21, 2018
  21. Jeff KingMar 21, 2018
  22. Dakota HawkinsMar 21, 2018
  23. Jeff KingMar 21, 2018
  24. Junio C HamanoMar 21, 2018
  25. Duy NguyenMar 21, 2018
  26. Junio C HamanoMar 20, 2018
  27. Dakota HawkinsMar 20, 2018
  28. Jeff KingMar 20, 2018

Read the whole thread, see it on lore, or plain text.

$ cat FOOTERMessages come from the public archive at lore.kernel.org/git, fetched every hour. The front page is chosen and written each morning by an AI editor and can be wrong; the threads themselves are the record. About and API. For agents: an MCP server at https://gitlist.dev/mcp, and any thread, story or person page as Markdown by adding .md to its URL (or sending Accept: text/markdown). Details in /llms.txt.