Is it possible to perform a 'grep search' in all the branches of a Git project?
是否可以在Git控件源项目的所有分支内运行
问题"如何在git历史中grep(搜索)已提交的代码?"建议:
1 | git grep <regexp> $(git rev-list --all) |
搜索所有提交,其中应包括所有分支。
另一种形式是:
1 2 3 4 5 | git rev-list --all | ( while read revision; do git grep -F 'yourWord' $revision done ) |
您可以在本文中找到更多示例:
I tried the above on one project large enough that git complained about the argument size, so if you run into this problem, do something like:
1 | git rev-list --all | (while read rev; do git grep -e <regexp> $rev; done) |
(请参阅本答案最后一节中的替代方案,如下)
如果您需要,请不要忘记这些设置:
1 2 3 4 | # Allow Extended Regular Expressions git config --global grep.extendRegexp true # Always Include Line Numbers git config --global grep.lineNumber true |
这个别名也有帮助:
1 | git config --global alias.g"grep --break --heading --line-number" |
注意:chernjie建议
A more refined command can be:
1 | git branch -a | tr -d \* | xargs git grep <regexp> |
Which will allow you to search only branches (including remote branches)
You can even create a bash/zsh alias for it:
1 2 | alias grep_all="git branch -a | tr -d \* | xargs git grep" grep_all <regexp> |
2016年8月更新:R.M。建议在评论中
I got a"
fatal: bad flag '->' used after filename " when trying thegit branch version. The error was associated with aHEAD aliasing notation.I solved it by adding a
sed '/->/d' in the pipe, between thetr and thexargs commands.
1 | git branch -a | tr -d \* | sed '/->/d' | xargs git grep <regexp> |
那是:
1 2 | alias grep_all="git branch -a | tr -d \* | sed '/->/d' | xargs git grep" grep_all <regexp> |
1 2 | git log -p --all -S 'search string' git log -p --all -G 'match regular expression' |
这些日志命令列出了添加或删除给定搜索字符串/正则表达式的提交,(通常)最近更新。
找到一个添加了您正在寻找的文本的相关提交(例如,8beeff00d),找到包含提交的分支:
1 | git branch -a --contains 8beeff00d |
我发现这个最有用:
1 | git grep -i foo `git for-each-ref --format='%(refname)' refs/` |
你需要调整最后的参数取决于你是否只想看远程和本地分支,即:
-
git grep -i foo $(git for-each-ref --format='%(refname)' refs/remotes) -
git grep -i foo $(git for-each-ref --format='%(refname)' refs/heads)
我创建的别名如下所示:
1 | grep-refs = !sh -c 'git grep"$0""$@""$(git for-each-ref --format="%(refname)"" refs/)' |
它可以通过两种常见方式实现:Bash或Git别名
这是三个命令:
用法与
1 2 | git grep-branch"find my text" git grep-branch --some-grep-options"find my text" |
GREP使用:Git别名
文件?/ .gitconfig
应该手动将命令添加到
1 2 3 4 | [alias] grep-branch ="!f(){ git branch -a | sed -e 's/[ \\*]*//' | grep -v -e '\\->' | xargs git grep $@; };f" grep-branch-remote ="!f(){ git branch -a | sed -e 's/[ \\*]*//' | grep -v -e '\\->' | grep '^remotes' | xargs git grep $@; };f" grep-branch-local ="!f(){ git branch -a | sed -e 's/[ \\*]*//' | grep -v -e '\\->' -e '^remotes' | xargs git grep $@; };f" |
注意:当您添加别名并且无法运行时 - 检查反斜杠
-
git branch -a - 显示所有分支; -
sed -e 's/[ \\*]*//' - 修剪空格(来自branch -a )和*(活动分支名称具有它); -
grep -v -e '\\->' - 忽略复杂的名称,如remotes/origin/HEAD -> origin/master ; -
grep '^remotes' - 获取所有远程分支; -
grep -v -e '^remotes' - 获取除远程分支以外的分支;
示例
1 2 3 4 | [user@pc project]$ git grep-branch-local -n getTastyCookies dev:53:modules/factory/getters.php:function getTastyCookies($user); master:50:modules/factory/getters.php:function getTastyCookies($user) |
目前的结构是:
GREP使用:BASH
您应该知道:Bash命令应存储在
仅限本地分支机构
1 | git branch -a | sed -e 's/[ \*]*//' | grep -v -e '\->' -e '^remotes' | xargs git grep"TEXT" |
仅限远程分支
1 | git branch -a | sed -e 's/[ \*]*//' | grep -v -e '\->' | grep '^remotes' | xargs git grep"TEXT" |
本地和远程分支机构
1 | git branch -a | sed -e 's/[ \*]*//' | grep -v -e '\->' | xargs git grep"TEXT" |
我是这样做的:
1 | git for-each-ref --format='%(*refname)' | xargs git grep SEARCHTERM |
如果您将任何提交SHA1提供给
要搜索所有分支,您可以使用
1 | git grep"regexp" $(git rev-list --all) |
......并且有耐心