我正在查看一个相当大的项目的git存储库,其测试套件分散在各个子目录中的多个文件中。所有测试用例文件名都遵循相同的通配符模式(例如,test-*
)。鉴于此,如何列出提交到存储库的最新测试用例?
我不太关注那些提交创建测试用例还是只是最后修改测试用例。要么没事。我只想看一些由项目贡献者编写/修改的新测试。
据我所知:
git log -- */test*
仅显示在层次结构中触摸测试用例一级的提交,而不是低级。
答案 0 :(得分:5)
如果*/test*
与某些文件匹配,则shell将展开此表达式。尝试:
echo */test*
在shell提示符下。比较,例如:
$ cd /tmp
$ mkdir empty
$ cd empty
$ echo */test*
*/test*
/tmp/empty
为空,因此*/test*
不匹配。但那时:
$ mkdir dir; touch dir/test.file
$ echo */test*
dir/test.file
所以,如果你没有匹配*/test*
并且你运行:
$ somegitcommand */test*
git命令会将*/test*
视为其参数;但是如果你有匹配的东西,git命令会看到dir/test.file
作为它的参数。 *
已经消失了。
修复非常简单:引用*/test*
部分:
$ git log --oneline -- '*/test*'
现在git log
会看到*/test*
,而不是dir/test.file
,git将能够进行递归匹配。
值得一提的是,并非所有炮弹的行为方式都相同。在csh和tcsh中,如果没有像*/test.*
这样的shell glob匹配,你得到:
> rm -r dir
> echo */test*
echo: No match.
在bash中,您可以选择行为:
bash$ echo */test*
*/test*
bash$ shopt -s failglob
bash$ echo */test*
bash: no match: */test*
(实际上你可以在csh和tcsh中做同样的事情;它只是倒置了:set nonomatch
而*/test*
传递给echo
)。
此外,这说明了shell的通配符通配符(不会递归到子目录中)和git'(确实如此)之间的区别。请参阅Jubobs' answer并尝试(在shell中)echo */*/test*
vs echo */test*
(所有没有引号)。有些shell具有可以通过各种方式启用的递归globbing,例如使用**
来表示需要递归:echo **/test*
。
最后一点:git的通配符匹配从一个版本到另一个版本有所改变,特别是在.gitignore
个文件中。具体来说,**
表示"零个或多个目录" (特别是在.gitignore
文件中)已添加到version 1.8.2中的git。
答案 1 :(得分:2)
免责声明:这不是完整的图片;我只留下这个答案,因为torek在his much more complete answer中引用了它。
我在bash中使用Git 2.0.1,但我无法重现您所描述的行为:如下所示,
git log -1 -- */test*
显示在工作树的层次结构中添加/删除/修改与test*
两个级别匹配的文件的提交。也许处理glob模式的方式在v1.8.3和v2.0.1之间发生了变化。请考虑更新到更新版本。
# set things up
cd ~/Desktop
mkdir babyexample
cd babyexample
git init
# add three test files under foo/bar/
mkdir foo
cd foo
mkdir bar
cd bar
touch test1.py
touch test2.c
touch testmypatience.baz
cd ../..
git add .
git commit -m "add three test files"
# add a README
touch README.md
git add README.md
git commit -m "add README"
# remove test1.py
git rm foo/bar/test1.py
git commit -m "remove Python file"
# modify test2.c
printf "hello\n" > foo/bar/test2.c
git add test2.c
git commit -m "say hello in C file"
然后,
git log --oneline
输出
9537199 say hello in C file
20b90f2 remove Python file
494cf11 add README
bfb6686 add three test files
,而
git log --oneline -- */test*
按预期过滤日志输出:
9537199 say hello in C file
20b90f2 remove Python file
bfb6686 add three test files
答案 2 :(得分:1)
使用git diff
列出所有最近更改的tests
:
git diff --stat HEAD^ -- '**/test*'
path/to/test_x | 17 -----------------
path/to/test_y | 1 +
2 files changed, 1 insertions(+), 17 deletions(-)