查找添加到git存储库的最新文件,其名称与给定的通配符模式匹配

Arj*_*kar 3 git wildcard

我正在查看一个相当大的项目的git存储库,其测试套件分散在各个子目录中的几个文件中.所有测试用例文件名都遵循相同的通配符模式(例如test-*).鉴于此,如何列出提交到存储库的最新测试用例?

我不太关注这些提交是创建测试用例还是最后修改测试用例.要么没事.我只是想看看项目贡献者编写/修改的一些较新的测试.

据我所知:

git log -- */test*
Run Code Online (Sandbox Code Playgroud)

仅显示在层次结构中触摸测试用例一级的提交,而不是更低.

tor*_*rek 5

如果*/test*匹配某些文件,shell将扩展此表达式.尝试:

echo */test*
Run Code Online (Sandbox Code Playgroud)

在shell提示符下.比较,例如:

$ cd /tmp
$ mkdir empty
$ cd empty
$ echo */test*
*/test*
Run Code Online (Sandbox Code Playgroud)

/tmp/empty是空的,所以*/test*没有比赛.但是之后:

$ mkdir dir; touch dir/test.file
$ echo */test*
dir/test.file
Run Code Online (Sandbox Code Playgroud)

所以,如果你没有匹配*/test*,你运行:

$ somegitcommand */test*
Run Code Online (Sandbox Code Playgroud)

git命令将*/test*作为其参数; 但如果你有匹配的东西,git命令将dir/test.file作为其参数.该*■找消失了.

修复非常简单:引用*/test*部分:

$ git log --oneline -- '*/test*'
Run Code Online (Sandbox Code Playgroud)

现在git log将会看到*/test*,而不是dir/test.file和git将能够进行递归匹配.


值得一提的是,并非所有shell的行为方式都相同.在csh和tcsh中,如果没有类似shell的匹配*/test.*,你得到:

> rm -r dir
> echo */test*
echo: No match.
Run Code Online (Sandbox Code Playgroud)

在bash中,您可以选择行为:

bash$ echo */test*
*/test*
bash$ shopt -s failglob
bash$ echo */test*
bash: no match: */test*
Run Code Online (Sandbox Code Playgroud)

(实际上你可以在csh和tcsh中做同样的事情;它只是倒置了:set nonomatch并且*/test*传递给了echo).

此外,这说明了shell的通配符globbing(不会递归到子目录)和git(确实如此)之间的区别.请参阅Jubobs的回答并尝试(在shell中)echo */*/test*vs echo */test*(所有没有引号).一些shell具有递归globbing,可以通过各种方式启用,例如**用于表示需要递归:echo **/test*.


最后一点:git的通配符匹配从一个版本到另一个版本有所改变,特别是在.gitignore文件中.具体来说,**意味着"零个或多个目录"(特别是在.gitignore文件中)被添加到版本1.8.2中的 git中.