获取任何git repo并运行以下
git difftool -- asdfasdfasdsfawerf
即给它一个无效的文件名。它将立即返回,不显示差异,但它也有0个返回代码。显然,它应该会给出某种错误,因为这并不是说我的文件中没有diff,文件本身既不存在于我的工作树中,也不存在于HEAD中,所以我问了一个无效的问题。
如果您认为这是一个人为的例子,那么如果文件名键入错误,这可能是一个真正的问题。你最终认为文件中没有差异,而实际上它找不到文件。
如果找不到文件,有人知道强制它失败的方法吗?
似乎只有在使用--
时才会发生这种情况。删除它解决了问题,尽管它看起来仍然是一个bug。
git difftool
最终执行git diff "$@"
查看第2713:行的相关源代码
2713 if (strcmp(arg, "--"))
2714 continue;
2715 argv[i] = NULL;
2716 argc = i;
我们可以看到,当遇到CCD_ 4时,参数列表被缩短。
在代码的后面,在第2782行,如果不是上面的!strcmp("--", arg)
,文件名会被检查,并且会引发错误:
2781 for (j = i; j < argc; j++)
2782 verify_filename(revs->prefix, argv[j], j == i);
这似乎是修订版设置中的一个错误,但我对git没有贡献,所以不能对源代码说太多,我只花了几分钟时间深入研究。
当调用git diff -- abc
时,argv在被截断后将包含{ "diff" }
,当使用git diff abc
调用时,它将包含{ "diff", "abc" }