是否有可能在git项目的所有分支中执行“grepsearch”

是否有可能在git控件源项目的所有分支中运行git grep? 还是有另一个命令来运行?

“ 如何grep(search)git历史logging中提交的代码 ”的问题build议:

git grep <regexp> $(git rev-list --all) 

通过所有的提交,其中应该包括所有的分支。

另一种forms是:

 git rev-list --all | ( while read revision; do git grep -F 'yourWord' $revision done ) 

你可以在这篇文章中find更多的例子:

我在上面的一个项目上试了一下,git抱怨了参数的大小,所以如果遇到这个问题,可以这样做:

 git rev-list --all | (while read rev; do git grep -e <regexp> $rev; done) 

(请参阅下面的答案的最后一节中的替代scheme)

不要忘记这些设置,如果你想要的话:

 # Allow Extended Regular Expressions git config --global grep.extendRegexp true # Always Include Line Numbers git config --global grep.lineNumber true 

这个别名也可以帮助:

 git config --global alias.g "grep --break --heading --line-number" 

注意: chenjie build议 git rev-list --all是一个矫枉过正的行为。

更精确的命令可以是:

 git branch -a | tr -d \* | xargs git grep <regexp> 

这将允许您只search分支机构(包括远程分支机构)

你甚至可以为它创build一个bash / zsh别名:

 alias grep_all="git branch -a | tr -d \* | xargs git grep" git grep_all <regexp> 

2016年8月更新: RMbuild议在评论中

在尝试git branch版本时,我得到了“ fatal: bad flag '->' used after filename ”。 该错误与HEAD别名符号相关联。

我通过在trxargs命令之间的pipe道中添加sed '/->/d'来解决这个问题。

  git branch -a | tr -d \* | sed '/->/d' | xargs git grep <regexp> 

那是:

 alias grep_all="git branch -a | tr -d \* | sed '/->/d' | xargs git grep" git grep_all <regexp> 

git log可以成为在所有分支中search文本的更有效的方法,特别是如果有很多匹配,并且希望首先看到更新的(相关的)更改。

 git log -p --all -S 'search string' git log -p --all -G 'match regular expression' 

这些日志命令列出提交添加或删除给定的searchstring/正则expression式,(通常)更先进的提交。 -p选项会使相关的diff显示在添加或删除模式的位置,所以您可以在上下文中看到它。

find一个相关的提交,添加你正在寻找的文本(例如8beeff00d),find包含提交的分支:

 git branch -a --contains 8beeff00d 

我发现这个最有用:

 git grep -i foo `git for-each-ref --format='%(refname)' refs/` 

你需要调整最后的参数取决于你是否只想看看远程vs本地分支,即:

  • git grep -i foo $(git for-each-ref --format='%(refname)' refs/remotes)
  • git grep -i foo $(git for-each-ref --format='%(refname)' refs/heads)

我创build的别名如下所示:

 grep-refs = !sh -c 'git grep "$0" "$@" "$(git for-each-ref --format=\"%(refname)\"" refs/)' 

如果你提交任何提交SHA1 git grep你有他们search,而不是工作副本。

要search所有分支,你可以用git rev-list --all来获得所有的树。 把它放在一起

 git grep "regexp" $(git rev-list --all) 

…有耐心

以下是我如何做到这一点:

 git for-each-ref --format='%(*refname)' | xargs git grep SEARCHTERM 

即使这个话题是老的,但我想分享我的解决方法,其余的人可能会觉得它有用(作为我自己):

可以用两种常用的方法来实现:Bash或GIT别名

这里有3个命令:

  1. git grep-branch – 在本地和远程的所有分支中search
  2. git grep-branch-local – 仅在本地分支中search
  3. git grep-branch-remote – 仅限远程分支机构

用法与git grep相同

 git grep-branch "find my text" git grep-branch --some-grep-options "find my text" 

GREP使用:Git别名

文件〜/ .gitconfig

应该手动将命令添加到~/.gitconfig文件中,因为git config --global alias评估您添加并复杂化的复杂代码。

 [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 " 

注意:当你添加别名,并且他们无法运行 – 检查反斜杠\他们可能需要额外的转义\\相比, bash命令。

  • git branch -a – 显示所有分支;
  • sed -e 's/[ \\*]*//' – 修剪空格 (来自branch -a )和*(活动分支名称);
  • grep -v -e '\\->' – 忽略像remotes/origin/HEAD -> origin/master这样的复杂名称;
  • grep '^remotes' – 获取所有远程分支;
  • grep -v -e '^remotes' – 获取远程分支外的分支;

示例git grep-branch-local -n getTastyCookies

-n将行号前缀为匹配行。

 [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) 

目前的结构是:

: – 分隔符

  1. 分支: dev
  2. 行号: 53
  3. 文件path: modules/factory/getters.php
  4. 匹配的行: function getTastyCookies($user)

GREP使用:BASH

正如您应该知道的那样:Bash命令应该存储在.sh脚本中,或者在shell中运行。

仅限当地分行

 git branch -a | sed -e 's/[ \*]*//' | grep -v -e '\->' -e '^remotes' | xargs git grep "TEXT" 

只有远程分支

 git branch -a | sed -e 's/[ \*]*//' | grep -v -e '\->' | grep '^remotes' | xargs git grep "TEXT" 

本地和远程分支

 git branch -a | sed -e 's/[ \*]*//' | grep -v -e '\->' | xargs git grep "TEXT"