尽管git diff *.cpp
运行正常,但命令git diff *.h
刚刚停止在一个存储库中打印任何内容。 git diff
适用于* .cpp文件。
那会是什么?
答案 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.cpp
或zorg.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'
对于子目录中的所有文件都可以正常工作。