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

Re: [PATCH 3/3] grep: stop looking at random places for .gitattributes

From
Junio C Hamano <gitster@pobox.com>
Date
Oct 10, 2012, 19:44 UTC
Message-ID
<7vy5jeaz81.fsf@alter.siamese.dyndns.org>
In-Reply-To
<50756646.5060505@viscovery.net>
Johannes Sixt <j.sixt@viscovery.net> writes:
> Is there already an established definition which the "correct"
> .gitattributes are? IIRC, everywhere else we are looking at the
> .gitattributes in the worktree, regardless of whether the object at the
> path in question is in the worktree, the index, or in an old commit.

No, and it is deliberately kept vague while waiting for us to come up with a clear definition of what is "correct".

We could declare, from a purist's point of view, that the attribute should be taken from the same place as the path in question is taken from. When running "git add foo.c", we grab the contents of "foo.c" from the working tree, so ".gitignore" from the working tree should be applied when dealing with "foo.c". Similarly, the contents of blob "foo.c" that "git checkout foo.c" reads from the index would get attributes from ".gitignore" in the index (to find what its smudging semantics is) before it gets written out to the working tree. "git diff A B" may give the attributes from tree A to the preimage side while using the attributes from tree B to the postimage side.

But the last example has some practical issues. Very often, people retroactively define attributes to correct earlier mistakes. If an older tree A forgot to declare that a path mybank.gnucash is a GnuCash ledger file, while a newer tree B (and the current checkout that is even newer) does [*1*], it is more useful to apply the newer definition from .gitattributes to both trees in practice (and in practice, you are much less likely to have a check-out of ancient tree while running "git diff A B" to compare two trees that are newer than the current check-out). Using the file from the working tree is the best approximation of "we want to use the newer one", both from the semantics (i.e. you are likely to have fresher tree checked out) and the performance (i.e. reading from files in the working tree is far more trivial than reading from historical trees) point of view.

So it is not so cut-and-dried that "take the attributes from the same place" is a good and "correct" definition [*2*].

[Footnote]

*1* GnuCash writes, by default, a gzip compressed xml file, so I have in my .gitattributes file

	*.gnucash	filter=gnucash
and then in my .git/config
	[filter "gnucash"]
        	clean = gzip -dc
                smudge = gzip -c

This allows "git diff" to work reasonably well (if you do not mind reading diff between two versions of xml files, that is) and also helps delta compression when packing the repository.

*2* Besides, the attributes are primarily used to define the semantics about the contents in question. If one file is of "gnucash" kind (i.e. has "filter=gnucash" attribute in the previous example) in one tree, and the path is of a different kind (e.g. "filter=ooo" that says "this is an Ooo file"), it is very likely that it does not even make sense, with or without content filtering, to compare them with "git diff", so "take the attributes from the same place" would have to imply "if the attributes do not match, say something similar to 'Binary files differ'", which is just as useless as applying one attribute taken from a convenient but random place (i.e. the working tree).

Previous: Nguyen Thai Ngoc DuyNext: Johannes Sixt
Message 22 of 43 in “'git grep needle rev' attempts to access 'rev:.../.gitattributes' in the worktree”
  1. Johannes SixtOct 9, 2012
  2. Nguyen Thai Ngoc DuyOct 9, 2012
  3. Nguyen Thai Ngoc DuyOct 9, 2012
  4. Jeff KingOct 9, 2012
  5. Junio C HamanoOct 9, 2012
  6. Nguyen Thai Ngoc DuyOct 10, 2012
  7. Junio C HamanoOct 10, 2012
  8. Nguyen Thai Ngoc DuyOct 10, 2012
  9. Nguyễn Thái Ngọc DuyOct 10, 2012
  10. 1/3 quote: let caller reset buffer for quote_path_relative()Nguyễn Thái Ngọc Duy, Oct 10, 2012
  11. Junio C HamanoOct 10, 2012
  12. Nguyen Thai Ngoc DuyOct 11, 2012
  13. Junio C HamanoOct 11, 2012
  14. 2/3 grep: pass true path name to grep machineryNguyễn Thái Ngọc Duy, Oct 10, 2012
  15. 3/3 grep: stop looking at random places for .gitattributesNguyễn Thái Ngọc Duy, Oct 10, 2012
  16. Johannes SixtOct 10, 2012
  17. Nguyen Thai Ngoc DuyOct 10, 2012
  18. Johannes SixtOct 10, 2012
  19. Nguyen Thai Ngoc DuyOct 10, 2012
  20. Johannes SixtOct 10, 2012
  21. Nguyen Thai Ngoc DuyOct 10, 2012
  22. Junio C HamanoOct 10, 2012
  23. Johannes SixtOct 11, 2012
  24. Michael HaggertyOct 11, 2012
  25. Nguyen Thai Ngoc DuyOct 11, 2012
  26. 0/2 Re: 'git grep needle rev' attempts to access 'rev:.../.gitattributes' in the worktreeNguyễn Thái Ngọc Duy, Oct 10, 2012
  27. 1/2 quote: let caller reset buffer for quote_path_relative()Nguyễn Thái Ngọc Duy, Oct 10, 2012
  28. 2/2 grep: stop looking at random places for .gitattributesNguyễn Thái Ngọc Duy, Oct 10, 2012
  29. Johannes SixtOct 10, 2012
  30. Junio C HamanoOct 10, 2012
  31. Johannes SixtOct 11, 2012
  32. Junio C HamanoOct 11, 2012
  33. Johannes SixtOct 12, 2012
  34. Junio C HamanoOct 14, 2012
  35. Johannes SixtOct 15, 2012
  36. Junio C HamanoOct 15, 2012
  37. Johannes SixtOct 16, 2012
  38. Johannes SixtOct 17, 2012
  39. Junio C HamanoOct 17, 2012
  40. Nguyen Thai Ngoc DuyOct 11, 2012
  41. Junio C HamanoOct 11, 2012
  42. grep: stop looking at random places for .gitattributesNguyễn Thái Ngọc Duy, Oct 12, 2012
  43. Junio C HamanoOct 12, 2012

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.