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

eps*_*nes 119 git grep

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

Von*_*onC 172

问题" 如何在git历史中grep(搜索)已提交的代码? "建议:

 git grep <regexp> $(git rev-list --all)
Run Code Online (Sandbox Code Playgroud)

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

另一种形式是:

git rev-list --all | (
    while read revision; do
        git grep -F 'yourWord' $revision
    done
)
Run Code Online (Sandbox Code Playgroud)

您可以在本文中找到更多示例:

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

git rev-list --all | (while read rev; do git grep -e <regexp> $rev; done)
Run Code Online (Sandbox Code Playgroud)

(请参阅本答案最后一节中的替代方案,如下)

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

# Allow Extended Regular Expressions
git config --global grep.extendRegexp true
# Always Include Line Numbers
git config --global grep.lineNumber true
Run Code Online (Sandbox Code Playgroud)

这个别名也有帮助:

git config --global alias.g "grep --break --heading --line-number"
Run Code Online (Sandbox Code Playgroud)

注意:chernjie 建议git rev-list --all是一种矫枉过正.

更精确的命令可以是:

git branch -a | tr -d \* | xargs git grep <regexp>
Run Code Online (Sandbox Code Playgroud)

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

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

alias grep_all="git branch -a | tr -d \* | xargs git grep"
grep_all <regexp>
Run Code Online (Sandbox Code Playgroud)

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

fatal: bad flag '->' used after filename在尝试git branch版本时我得到了一个" " .该错误与HEAD别名表示法相关联.

我通过sed '/->/d'在管道中添加一个trxargs命令之间来解决它.

 git branch -a | tr -d \* | sed '/->/d' | xargs git grep <regexp>
Run Code Online (Sandbox Code Playgroud)

那是:

alias grep_all="git branch -a | tr -d \* | sed '/->/d' | xargs git grep"
grep_all <regexp>
Run Code Online (Sandbox Code Playgroud)

  • 有没有办法显示与搜索匹配的分支的名称? (5认同)

Edw*_*son 49

git log 可以是跨所有分支搜索文本的更有效方式,特别是如果有许多匹配,并且您希望首先看到更新的(相关)更改.

git log -p --all -S 'search string'
git log -p --all -G 'match regular expression'
Run Code Online (Sandbox Code Playgroud)

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

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

git branch -a --contains 8beeff00d
Run Code Online (Sandbox Code Playgroud)


err*_*per 19

我发现这个最有用:

git grep -i foo `git for-each-ref --format='%(refname)' refs/`
Run Code Online (Sandbox Code Playgroud)

您需要调整最后的参数,具体取决于您是否只想查看远程与本地分支,即:

  • 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/)'
Run Code Online (Sandbox Code Playgroud)


小智 6

可以通过两种常见的方式来做到这一点:Bash或Git别名

这是三个命令:

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

用法与 git grep

git grep-branch "find my text"
git grep-branch --some-grep-options "find my text"
Run Code Online (Sandbox Code Playgroud)

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 "
Run Code Online (Sandbox Code Playgroud)

注意:添加别名后,别名将无法运行- 与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)
Run Code Online (Sandbox Code Playgroud)

当前结构为:

: - 分隔器

  1. 科: dev
  2. 电话号码: 53
  3. 文件路径: 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"
Run Code Online (Sandbox Code Playgroud)

仅远程分支

git branch -a | sed -e 's/[ \*]*//' | grep -v -e '\->' | grep '^remotes' | xargs git grep "TEXT"
Run Code Online (Sandbox Code Playgroud)

本地和远程分支机构

git branch -a | sed -e 's/[ \*]*//' | grep -v -e '\->' | xargs git grep "TEXT"
Run Code Online (Sandbox Code Playgroud)