在所有Git分支中搜索文件

33

如何搜索项目的所有Git分支中的文件名?

我只记得文件名的一部分(仅限结尾),所以我想要搜索类似于*_robot.php这样的内容,跨越所有分支,并查看哪些文件与之匹配。我希望它能够搜索历史记录,而不仅仅是分支的HEAD。


2
可能是重复的问题:如何在Git分支中搜索文件或目录? - Robin Green
2个回答

36

这是一种方法:

git log --all --name-only --pretty=format: | sort -u | grep _robot.php

如果您需要知道更改的sha1,可以将“before context”参数传递给grep,即-B 100git log --all --name-only --pretty=format: | sort -u | grep _robot.php -B 10 - Cory Dolphin
2
git log --all --name-only --pretty=format:'%H %f' | grep _robot.php -B 10 - hojin

9
这是对 @manojlds 解决方案的简化版本:Git 确实可以直接考虑所有分支(--all),打印它们修改过的文件名(--name-only),以及仅这些文件名(--pretty=format:)。
但是 Git 也可以首先通过在 -- 分隔符之后放置文件名正则表达式来筛选某些文件名(正则表达式)。
git log --all --name-only --pretty=format: -- <file_name_regexp> | sort -u

所以,你可以直接这样做:
git log --all --name-only --pretty=format: -- _robot.php | sort -u

太好了,现在我怎么查看该文件的最新内容? - ma11hew28
3
例如,您可以执行git log --all --name-only --pretty=format:%H -- <file_name_regexp> | less,然后通过键入斜杠(/)来查找您感兴趣的文件名:修改的文件名在它们的修订哈希之前。(然后您可以进行通常的git checkout <revision>以查看该文件。) - Eric O. Lebigot
1
你能详细说明哪里出了问题吗?我很困惑为什么它不起作用,因为这个答案在3年前就可以使用,并且在当前版本的git中仍然有效,所以我不确定为什么它会在发布于之间的git 2.1.4上失败。 - Eric O. Lebigot
更美观的命令:git log --all --name-only --pretty=format:'%Cred%h%Creset -%C(yellow)%d%Creset %s %Cgreen(%cr) %C(bold blue)<%an>%Creset' -- '**/blob*' | less - ptim

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接