是否可以在Git项目的所有分支中执行'grep搜索'?

时间:2013-03-08 10:58:37

标签: git grep

是否可以在Git控件源项目的所有分支内运行git grep?或者还有另一个命令可以运行吗?

6 个答案:

答案 0 :(得分:157)

问题“How to grep (search) committed code in the git history?”建议:

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

搜索所有提交,其中应包括所有分支。

另一种形式是:

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

您可以在this article中找到更多示例:

  

我在一个项目上尝试了上述内容,以至于git抱怨了参数大小,所以如果遇到这个问题,请执行以下操作:

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

(参见本答案最后一节中的替代方案)

如果您需要,请不要忘记这些设置:

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

注意:chernjie suggested git rev-list --all是一种矫枉过正的行为。

  

更精确的命令可以是:

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

这将允许您仅搜索分支(包括远程分支)

     

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

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

2016年8月更新:R.M.建议在评论中

  

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

     

我通过在sed '/->/d'tr命令之间的管道中添加xargs来解决它。

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

那是:

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

答案 1 :(得分:45)

git log可以更有效地在所有分支中搜索文本,特别是如果有很多匹配项,并且您希望首先查看更多近期(相关)更改。

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

这些日志命令列出了添加或删除给定搜索字符串/正则表达式的提交,(通常)最近更新。 -p选项会导致相关差异显示在添加或删除模式的位置,因此您可以在上下文中查看。

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

git branch -a --contains 8beeff00d

答案 2 :(得分:19)

我发现这最有用:

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)

我创建的别名如下所示:

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

答案 3 :(得分:4)

以下是我的表现方式:

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

答案 4 :(得分:4)

即使主题已经过时了,但我想与其他可能认为有用的人(我自己)分享我的解决方法:

可以通过两种常见方式实现:Bash或GIT别名

这是3个命令:

  1. git grep-branch - 在所有分支机构中搜索本地&amp;远程
  2. git grep-branch-local - 仅在本地分支机构中搜索
  3. git grep-branch-remote - 仅限远程分支
  4. 用法与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. 文件路径:modules/factory/getters.php
    4. 匹配行:function getTastyCookies($user)
    5. 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"
      

      本地&amp;远程分支

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

答案 5 :(得分:3)

如果您将任何提交SHA1提交给git grep,您可以在其中搜索,而不是工作副本。

要搜索所有分支,您可以使用git rev-list --all 所有树。把它全部用

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

......并且有耐心