我正在查看一个相当大的项目的git存储库,其测试套件分散在各个子目录中的几个文件中.所有测试用例文件名都遵循相同的通配符模式(例如test-*).鉴于此,如何列出提交到存储库的最新测试用例?
我不太关注这些提交是创建测试用例还是最后修改测试用例.要么没事.我只是想看看项目贡献者编写/修改的一些较新的测试.
据我所知:
git log -- */test*
Run Code Online (Sandbox Code Playgroud)
仅显示在层次结构中触摸测试用例一级的提交,而不是更低.
如果*/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中.
| 归档时间: |
|
| 查看次数: |
75 次 |
| 最近记录: |