问题“如何在 Git 历史记录中 grep(搜索)提交的代码? https://stackoverflow.com/q/2928584/6309”建议:
git grep <regexp> $(git rev-list --all)
这将搜索所有提交,其中应包括所有分支。
另一种形式是:
git rev-list --all | (
while read revision; do
git grep -F 'yourWord' $revision
done
)
您可以在以下位置找到更多示例本文 http://travisjeffery.com/b/2012/02/search-a-git-repo-like-a-ninja/:
我在一个足够大的项目上尝试了上述方法,以至于 git 抱怨参数大小,所以如果你遇到这个问题,请执行以下操作:
git rev-list --all | (while read rev; do git grep -e <regexp> $rev; done)
(请参阅下面本答案最后一部分中的替代方案)
如果您需要的话,请不要忘记这些设置:
# 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. https://stackoverflow.com/users/3022952/r-m评论里推荐
我有一个 ”fatal: bad flag '->' used after filename
“当尝试git branch
版本。该错误与HEAD
别名表示法。
我通过添加解决了这个问题sed '/->/d'
在管道中,在tr
和xargs
命令。
git branch -a | tr -d \* | sed '/->/d' | xargs git grep <regexp>
That is:
alias grep_all="git branch -a | tr -d \* | sed '/->/d' | xargs git grep"
grep_all <regexp>
这是对解决方案的改进chernjie https://stackoverflow.com/users/1477655/chernjie had 建议 https://stackoverflow.com/review/suggested-edits/5432005, since 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>