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

时间:2014-08-23 00:40:16

标签: git wildcard

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

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

据我所知:

git log -- */test*

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

3 个答案:

答案 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(-)