是否可以在Git控件源项目的所有分支中运行git grep?或者是否有其他命令要运行?
git grep
fafcakar1#
问题“How to grep (search) committed code in the git history?“建议:
git grep <regexp> $(git rev-list --all)
它搜索所有的提交,应该包括所有的分支。另一种形式是:
git rev-list --all | ( while read revision; do git grep -F 'yourWord' $revision done )
您可以在this article中找到更多示例:我在一个大到git抱怨参数太大的项目上尝试了上面的方法,所以如果你遇到这个问题,可以这样做:
git rev-list --all | (while read rev; do git grep -e <regexp> $rev; done)
(see在本答案的最后一部分提供了一个备选方案)如果需要,请不要忘记这些设置:
# Allow Extended Regular Expressions git config --global grep.extendedRegexp true # Always Include Line Numbers git config --global grep.lineNumber true
这个别名也可以帮助:
git config --global alias.g "grep --break --heading --line-number"
2016年8月更新:R.M.在评论中推荐我在尝试git branch版本时得到了一个“fatal: bad flag '->' used after filename“。这个错误与HEAD别名表示法有关。我通过在tr和xargs命令之间的管道中添加一个sed '/->/d'来解决这个问题。
git branch
fatal: bad flag '->' used after filename
HEAD
tr
xargs
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" grep_all <regexp>
这是对chernjie和suggested的解决方案的改进,因为git rev-list --all是一个过度的解决方案。更精确的命令可以是:
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>
stszievb2#
git log是在所有分支中搜索文本的一种更有效的方法,特别是在有许多匹配项,并且您希望首先查看最近(相关)的更改时。
git log
git log -p --all -S 'search string' git log -p --all -G 'match regular expression'
这些日志命令列出了添加或删除给定搜索字符串/regex的提交,(通常)最近的在前。-p选项使相关的diff显示在添加或删除模式的位置,这样你就可以在上下文中看到它。找到一个添加了你要找的文本的相关提交(例如8beeff 00 d),找到包含该提交的分支:
-p
git branch -a --contains 8beeff00d
vktxenjb3#
我发现这个最有用:
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/)'
os8fio9y4#
有两种常见的方法可以做到这一点:Bash或Git别名以下是三个命令:
git grep-branch
git grep-branch-local
git grep-branch-remote
git grep-branch "find my text" git grep-branch --some-grep-options "find my text"
文件~/.gitconfig
应手动将命令添加到~/.gitconfig文件,因为git config --global alias会评估您添加复杂代码并将其弄乱
~/.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 "
注意:当您添加别名时,如果它们无法运行- check反斜杠\,则与 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将行号作为匹配行的前缀。
-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.分支:dev1.行号:x1米19英寸1x1.文件路径:modules/factory/getters.php1.匹配行:function getTastyCookies($user)
:
dev
modules/factory/getters.php
function getTastyCookies($user)
如您所知:Bash命令应存储在.sh脚本中或在shell中运行。
.sh
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"
klsxnrf15#
我是这样做的:
git for-each-ref --format='%(*refname)' | xargs git grep SEARCHTERM
mfpqipee6#
如果你给予任何提交一个SHA-1哈希值git grep,你会让它在它们中搜索,而不是在工作副本中。要搜索所有分支,可以用git rev-list --all得到 all 树。
git grep "regexp" $(git rev-list --all)
...并保持耐心
6条答案
按热度按时间fafcakar1#
问题“How to grep (search) committed code in the git history?“建议:
它搜索所有的提交,应该包括所有的分支。
另一种形式是:
您可以在this article中找到更多示例:
我在一个大到git抱怨参数太大的项目上尝试了上面的方法,所以如果你遇到这个问题,可以这样做:
(see在本答案的最后一部分提供了一个备选方案)
如果需要,请不要忘记这些设置:
这个别名也可以帮助:
2016年8月更新:R.M.在评论中推荐
我在尝试
git branch
版本时得到了一个“fatal: bad flag '->' used after filename
“。这个错误与HEAD
别名表示法有关。我通过在
tr
和xargs
命令之间的管道中添加一个sed '/->/d'
来解决这个问题。那就是:
这是对chernjie和suggested的解决方案的改进,因为
git rev-list --all
是一个过度的解决方案。更精确的命令可以是:
这将允许您仅搜索分支(包括远程分支)
您甚至可以为它创建一个bash/zsh别名:
stszievb2#
git log
是在所有分支中搜索文本的一种更有效的方法,特别是在有许多匹配项,并且您希望首先查看最近(相关)的更改时。这些日志命令列出了添加或删除给定搜索字符串/regex的提交,(通常)最近的在前。
-p
选项使相关的diff显示在添加或删除模式的位置,这样你就可以在上下文中看到它。找到一个添加了你要找的文本的相关提交(例如8beeff 00 d),找到包含该提交的分支:
vktxenjb3#
我发现这个最有用:
您需要根据是否只查看远程分支和本地分支来调整最后的参数,即:
git grep -i foo $(git for-each-ref --format='%(refname)' refs/remotes)
git grep -i foo $(git for-each-ref --format='%(refname)' refs/heads)
我创建的别名如下所示:
os8fio9y4#
有两种常见的方法可以做到这一点:Bash或Git别名
以下是三个命令:
git grep-branch
-搜索本地和远程的所有分支git grep-branch-local
-仅在本地分支机构中搜索git grep-branch-remote
-仅限远程分支机构用法与
git grep
相同GREP使用:Git别名
文件~/.gitconfig
应手动将命令添加到
~/.gitconfig
文件,因为git config --global alias
会评估您添加复杂代码并将其弄乱注意:当您添加别名时,如果它们无法运行- check反斜杠
\
,则与 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
将行号作为匹配行的前缀。当前结构为:
:
-分离器1.分支:
dev
1.行号:x1米19英寸1x
1.文件路径:
modules/factory/getters.php
1.匹配行:
function getTastyCookies($user)
GREP使用:巴斯
如您所知:Bash命令应存储在
.sh
脚本中或在shell中运行。仅本地分支
仅限远程分支
本地和远程分支机构
klsxnrf15#
我是这样做的:
mfpqipee6#
如果你给予任何提交一个SHA-1哈希值
git grep
,你会让它在它们中搜索,而不是在工作副本中。要搜索所有分支,可以用
git rev-list --all
得到 all 树。...并保持耐心