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

Reply via email to