我正在查看一个相当大的项目的 git 存储库,该项目的测试套件分散在各个子目录中的多个文件中。所有测试用例文件名都遵循相同的通配符模式(例如,test-*
)。鉴于此,我如何列出提交到存储库的最新测试用例?
对于这些提交是创建一个测试用例还是只是最后修改一个测试用例,我并不太在意。两者都可以。我只想看看项目贡献者编写/修改的一些较新的测试。
据我所知:
git log -- */test*
仅显示触及测试用例在层次结构中向下一层的提交,而不是更低。
最佳答案
如果 */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 将能够进行递归匹配。
值得一提的是,并非所有 shell 的行为方式都相同。在 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
文件中)被添加到 git 的 version 1.8.2 中。 .
关于git - 查找添加到名称与给定通配符模式匹配的 git 存储库的最新文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25457388/