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

[PATCH 0/2] Demonstrate and partially work around a gitattributes problem

From
Johannes Schindelin <johannes.schindelin@gmx.de>
Date
May 15, 2017, 15:23 UTC
Message-ID
<cover.1494861793.git.johannes.schindelin@gmx.de>
Granted, it is a bit of a less common use case to call
	git diff <commit1>:<file1> <commit2>:<file2>
There are valid scenarios for such calls, of course.

And sometimes, one may want to compare even files that are stored in subdirectories instead of the top-level directory. Example:

	git diff cafebabe:t/README bee7e55:t/README

Now, the surprising part is that Git tries to read a .gitattributes files interpreting the *entire* prefix `cafebabe:t/` as a *directory path*. I.e. it will try to read the *file* (not the blob) `cafebabe:t/.gitattributes`.

A remarkable side effect prevents this from happening for files in the top-level directory: there is no slash in the argument, therefore the top-level .gitattributes (which have been read from the index/worktree already) is used.

Unless, of course, one specifies the commit via a ref whose name contains slashes.

As mentioned in the commit message of the patch demonstrating the problem, I fear that this issue is *really* hard to fix. Certainly too complicated for me alone.

Side note: I was really, really surprised, in a very positive way, that Git handled the scenario gracefully where I *created* files with the actual file paths <commit1>:<file1> and <commit2>:<file2>, i.e. where `git diff <commit1>:<file1> <commit2>:<file2>` is ambiguous because it could refer to two objects or to two files. In this case, Git warns about the ambiguity (it is *slightly* misleading that it says to separate *revisions* using `--`, as we do not want to compare revisions... but it is definitely better than picking one side of the ambiguity and running with it).

Git for Windows carries the second patch for ages already, and I would have contributed it much earlier if I had not been busy with other patches. The reason I submit it now is that it conflicts with Duy's fopen_or_warn() patch series.

Johannes Schindelin (2):
  gitattributes: demonstrate that Git tries to read a bogus file
  mingw: Suppress warning that <commit>:.gitattributes does not exist
 attr.c                |  2 +-
 t/t0003-attributes.sh | 21 +++++++++++++++++++++
 2 files changed, 22 insertions(+), 1 deletion(-)
base-commit: b06d3643105c8758ed019125a4399cb7efdcce2c
Published-As: https://github.com/dscho/git/releases/tag/no-commit-colon-gitattributes-v1
Fetch-It-Via: git fetch https://github.com/dscho/git no-commit-colon-gitattributes-v1
-- 
2.13.0.windows.1
Next: Johannes Schindelin
Message 1 of 33 in “Demonstrate and partially work around a gitattributes problem”
  1. 0/2 Demonstrate and partially work around a gitattributes problemJohannes Schindelin, May 15, 2017
  2. 1/2 gitattributes: demonstrate that Git tries to read a bogus fileJohannes Schindelin, May 15, 2017
  3. 2/2 mingw: Suppress warning that <commit>:.gitattributes does not existJohannes Schindelin, May 15, 2017
  4. Jeff KingMay 16, 2017
  5. Jeff KingMay 16, 2017
  6. Junio C HamanoMay 17, 2017
  7. Jeff KingMay 17, 2017
  8. Johannes SchindelinMay 18, 2017
  9. Jeff KingMay 19, 2017
  10. 0/15 retain blob info for git diff HEAD:foo HEAD:barJeff King, May 19, 2017
  11. 01/15 handle_revision_arg: reset "dotdot" consistentlyJeff King, May 19, 2017
  12. Philip OakleyMay 20, 2017
  13. Jeff KingMay 23, 2017
  14. Philip OakleyMay 23, 2017
  15. 02/15 handle_revision_arg: simplify commit reference lookupsJeff King, May 19, 2017
  16. 03/15 handle_revision_arg: stop using "dotdot" as a generic pointerJeff King, May 19, 2017
  17. Junio C HamanoMay 24, 2017
  18. Jeff KingMay 24, 2017
  19. 04/15 handle_revision_arg: hoist ".." check out of range parsingJeff King, May 19, 2017
  20. 05/15 handle_revision_arg: add handle_dotdot() helperJeff King, May 19, 2017
  21. Junio C HamanoMay 24, 2017
  22. 06/15 sha1_name: consistently refer to object_context as "oc"Jeff King, May 19, 2017
  23. 07/15 get_sha1_with_context: always initialize oc->symlink_pathJeff King, May 19, 2017
  24. 08/15 get_sha1_with_context: dynamically allocate oc->pathJeff King, May 19, 2017
  25. 09/15 t4063: add tests of direct blob diffsJeff King, May 19, 2017
  26. 10/15 handle_revision_arg: record modes for "a..b" endpointsJeff King, May 19, 2017
  27. 11/15 handle_revision_arg: record paths for pending objectsJeff King, May 19, 2017
  28. 12/15 diff: pass whole pending entry in blobinfoJeff King, May 19, 2017
  29. 13/15 diff: use the word "path" instead of "name" for blobsJeff King, May 19, 2017
  30. 14/15 diff: use pending "path" if it is availableJeff King, May 19, 2017
  31. 15/15 diff: use blob path for blob/file diffsJeff King, May 19, 2017
  32. Junio C HamanoMay 24, 2017
  33. Jeff KingMay 24, 2017

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.