This problem has been reported originally in August 2015, as https://github.com/git-for-windows/git/issues/255 The symptom: when passing <commit>:<directory>/<file> style arguments to `git diff`, Git tries to read the attributes from a file called <commit>:<directory>/.gitattributes. This symptom is more prominent on Windows because the colon in the file name is illegal, and therefore reported to the user. On Linux, the colon is legal, and it just so happens that that file typically does not exist, and therefore there are no adverse consequences. However, it is still a bug: Git should not even attempt to open that file. Let's add a test case to demonstrate that problem, even on Linux and MacOSX. The underlying problem will be really tricky to fix: the run_diff*() family of functions expects the path passed via the diff_filespec structs to be the path as if it were in the worktree. However, when processing the `git diff <blob1> <blob2>` invocation, Git uses setup_revisions()'s parsing of the pending objects to fill in this information, and setup_revisions() simply copies the command-line argument, rather than reconstructing the actual *file* path. Signed-off-by: Johannes Schindelin <johannes.schindelin@xxxxxx> --- t/t0003-attributes.sh | 21 +++++++++++++++++++++ 1 file changed, 21 insertions(+) diff --git a/t/t0003-attributes.sh b/t/t0003-attributes.sh index f19ae4f8ccd..a7820022d8d 100755 --- a/t/t0003-attributes.sh +++ b/t/t0003-attributes.sh @@ -323,4 +323,25 @@ test_expect_success 'bare repository: test info/attributes' ' ) ' +test_expect_failure 'a file <commit>:.gitattributes is ignored' ' + git init bogus-file && + ( + cd bogus-file && + mkdir sub && + test_commit sub/file && + test_commit sub/file2 && + commit=$(git rev-parse HEAD) && + if test_have_prereq !MINGW + then + # Windows does not support colons in filenames + mkdir $commit:sub && + echo "* -inva/id" >$commit:sub/.gitattributes + fi && + git diff $commit:sub/file.t..$commit:sub/file2.t >out 2>err && + ! grep "is not a valid attribute name" err && + # On Windows, there will be a warning because of the colon + ! grep "warning: unable to access .$commit:sub" err + ) +' + test_done -- 2.13.0.windows.1