是否有可能运行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'
在管道中,间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>
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个命令:
-
git grep-branch
-搜索在所有分支机构本地及远程 -
git grep-branch-local
-在当地的分支机构只搜索 -
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)
目前的结构是:
:
-分隔符
- 科:
dev
- 行号:
53
- 文件路径:
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"
Answer 6:
如果你给任何承诺SHA1算法git grep
你拥有了它在其中搜索,而不是工作副本。
要搜索所有分支,你可以得到所有的树木git rev-list --all
。 把它全部用
git grep "regexp" $(git rev-list --all)
...和有耐心