是否有可能在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
别名符号相关联。我通过在
tr
和xargs
命令之间的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个命令:
-
git grep-branch
– 在本地和远程的所有分支中search -
git grep-branch-local
– 仅在本地分支中search -
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)
目前的结构是:
:
– 分隔符
- 分支:
dev
- 行号:
53
- 文件path:
modules/factory/getters.php
- 匹配的行:
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"