是否有可能进行一个Git项目的所有分支“grep的搜索”?(Is it possible to pe

2019-07-21 04:53发布

是否有可能运行git grep一个Git源控制项目中的所有分支里面? 还是有其他的命令来运行?

Answer 1:

这个问题:“ 如何用grep(搜索)在提交历史提交的代码? ”建议:

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

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

另一种形式是:

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

你可以找到更多的例子这篇文章 :

我想上面的一个项目足够大,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 建议是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月: RM建议的意见

我得到了一个“ fatal: bad flag '->' used after filename ”尝试当git branch版本。 误差用相关联的HEAD混叠符号。

我通过添加解决它sed '/->/d'在管道中,间trxargs命令。

 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>


Answer 2:

git log可以搜索所有分支机构的文本更有效的方式,尤其是如果有很多比赛,你想先看看最近的(相关)的变化。

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

这些日志命令列表提交添加或移除给定的搜索字符串/正则表达式,(一般)最近首次。 该-p选项将导致显示的相关差异,其中已添加或删除的模式,所以你可以看到它在上下文中。

在找到相关的提交,增加了你要找的人(如8beeff00d)的文本,找到包含提交的分支:

git branch -a --contains 8beeff00d


Answer 3:

我发现这非常有用:

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)

我创建的别名是这样的:

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


Answer 4:

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

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


Answer 5:

即使题目是老了,但我想分享我对谁可能会发现它很有用(我自己),其余的解决方法:

这是可能做到这一点在两种常用方法:bash或GIT别名

这里是3个命令:

  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"

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 "

注意:当您添加的别名,它们无法运行-检查反斜杠\他们可能需要额外的逃生\\在比较来砸命令。

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

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"


Answer 6:

如果你给任何承诺SHA1算法git grep你拥有了它在其中搜索,而不是工作副本。

要搜索所有分支,你可以得到所有的树木git rev-list --all 。 把它全部用

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

...和有耐心



文章来源: Is it possible to perform a 'grep search' in all the branches of a Git project?
标签: git grep