* .cpp文件的git diff在一个存储库中不打印任何内容

时间:2019-01-10 08:07:44

标签: linux git diff

尽管git diff *.cpp运行正常,但命令git diff *.h刚刚停止在一个存储库中打印任何内容。 git diff适用于* .cpp文件。

那会是什么?

2 个答案:

答案 0 :(得分:1)

该修复程序要谨慎运行,例如:

git diff '*.cpp'

或:

git diff \*.cpp

或更正式:

git diff -- '*.cpp'

或类似的

这是怎么回事?

缺少这个问题:所需的输出是subdir/subfile.cpp的差异,但是工作树的顶层包含一个名为file.cpp或类似名称的文件。

问题源于您使用的是Unix / Linux风格的外壳,该外壳在运行命令 之前会扩展*和其他通配符或glob个字符您在命令行中输入。但是这里也有一些微妙之处。

运行时,因为当前目录中存在一个名为file.cpp的文件,

git diff *.cpp

shell *.cpp替换为名称以.cpp结尾的所有文件的名称,并因此运行:

git diff file.cpp

然后,Git会尽职尽责地为一个名为file.cpp的文件生成差异(在这种情况下,由于没有差异,因此没有差异)。

如果顶级目录中没有名为file.cppzorg.cpp或类似名称的 个文件,则此shell只需使用参数{{ 1}}和git,就好像您引用了星号一样。这给 Git 提供了扩展diff参数的机会,并且 Git 对其进行扩展时,它的执行方式与Shell有所不同。

为什么使用*.cpp

*.cpp命令具有许多选项,例如--git diff-s-p-w等上。

根据您拥有的文件,假设您想要当前目录中名为--name-status的文件的差异列表。如果您随后运行:

--name-only

Git认为您的意思是提供-z 选项,而不是获取名为git diff -z 的文件的差异列表。如果您想要-z之类的差异,也会遇到类似的问题。

通常,您可以通过使用文件名-z而不只是-z*来解决此问题。由于./-z并非以-z开头,因此Git不会误以为这是一个选择。但是这个问题更普遍,在其他情况下(其他命令)也会发生。例如,假设您有一个名为./-z文件并运行:

-

Git会认为您的意思是检出名为develop分支

所有Git命令都将git checkout develop 用作分隔符,通常意味着没有更多选择:这之后的所有内容都将作为参数。对于develop--之后的所有内容都被视为 pathspec ,其中包括进行glob扩展,前提是glob字符可以通过外壳。

这是the SYNOPSIS section of the git diff documentation中的语法描述的含义:

git diff

方括号表示某些内容是可选的,因此所有选项都是可选的。尖括号表示应将一些自变量替换为满足括号内类型要求的字符串。文字--或其他文字选项表示您应按字面形式键入这些字符-例如,git diff [<options>] [<commit>] [--] [<path>...] git diff [<options>] --cached [<commit>] [--] [<path>...] git diff [<options>] <commit> <commit> [--] [<path>...] git diff [<options>] <blob> <blob> git diff [<options>] --no-index [--] <path> <path> 需要文字字符串--。最后,git diff --cached的意思是“尽可能多地重复前一个”。

由于文字字符串--cached是可选的,因此您不必输入它-但如果这样做,则 之后的所有内容都必须采用...的形式。这种形式很笼统:几乎任何字符都是有效的。不过,该文档缺少对 pathspec 定义的交叉引用(在这里,可能应该使用--,而不仅仅是<path>)。路径规范的完整描述在the gitglossary中。

答案 1 :(得分:0)

所以我在存储库根目录中有一个.cpp文件,因此git diff *.cpp现在仅打印此文件的更改,而git diff '*.cpp'对于子目录中的所有文件都可以正常工作。