是否可以git grep
在 Git 控制源项目的所有分支中运行?还是有另一个命令可以运行?
6 回答
问题“如何在 git 历史中 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"
2016 年 8 月更新:RM在评论中推荐
fatal: bad flag '->' used after filename
尝试git branch
版本时我得到了一个“ ”。该错误与HEAD
别名表示法有关。
我通过
sed '/->/d'
在管道中添加 a 在 thetr
和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>
这是对chernjie建议的解决方案的改进,因为这是git rev-list --all
一种矫枉过正的做法。
更精细的命令可以是:
# Don't use this, see above
git branch -a | tr -d \* | xargs git grep <regexp>
这将允许您仅搜索分支(包括远程分支)
你甚至可以为它创建一个 bash/zsh 别名:
# Don't use this, see above
alias grep_all="git branch -a | tr -d \* | xargs git grep"
grep_all <regexp>
git log
可能是在所有分支中搜索文本的更有效方式,尤其是在有很多匹配项并且您希望首先查看最近(相关)更改的情况下。
git log -p --all -S 'search string'
git log -p --all -G 'match regular expression'
这些日志命令列出添加或删除给定搜索字符串/正则表达式的提交,(通常)首先是最近的。该-p
选项导致相关差异显示在添加或删除模式的位置,因此您可以在上下文中查看它。
找到添加了您要查找的文本的相关提交(例如 8beeff00d)后,找到包含该提交的分支:
git branch -a --contains 8beeff00d
我发现这个最有用:
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/)'
可以通过两种常见的方式做到这一点:Bash 或 Git 别名
下面是三个命令:
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 "
注意:当您添加别名并且它们无法运行时 - 检查反斜杠,与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
- 文件路径:
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"
如果你给任何提交一个 SHA-1 哈希值,git grep
你让它在其中搜索,而不是工作副本。
要搜索所有分支,您可以使用git rev-list --all
. 把它全部与
git grep "regexp" $(git rev-list --all)
...并有耐心
这是我的做法:
git for-each-ref --format='%(*refname)' | xargs git grep SEARCHTERM