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

标签 git wildcard

我正在查看一个相当大的项目的 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/

相关文章:

c++ - C++中的简单通配符搜索算法

linux - 命令 "sudo mv home/* *"的作用是什么?

bash - 使用 GitHub 时防止将大文本文件添加到提交中

使用预先存在的公钥进行 Git 克隆

django - Git - 如何将代码从我的中央 Git 存储库部署到我的生产服务器?

带有排除的 Git 稀疏 checkout

Git fetch 浅克隆没有获取匹配的提交

c++ - 需要正则表达式来提取 zip 文件中的所有文件

带有全文搜索通配符的 MySql MyIsam 表

javascript - 如何使用 MySQL 和 PHP 创建通配符搜索功能