Is it possible to perform a 'grep search' in all the branches of a Git project?
git, grep
Solution
The question "How to grep (search) committed code in the Git history?" recommends:
git grep <regexp> $(git rev-list --all)
That searches through all the commits, which should include all the branches.
Another form would be:
git rev-list --all | (
while read revision; do
git grep -F 'yourWord' $revision
done
)
You can find even more example in this article:
I tried the above on one project large enough that git complained about the argument size, so if you run into this problem, do something like:
git rev-list --all | (while read rev; do git grep -e <regexp> $rev; done)
(see an alternative in the last section of this answer, below)
Don't forget those settings, if you want them:
# Allow Extended Regular Expressions
git config --global grep.extendedRegexp true
# Always Include Line Numbers
git config --global grep.lineNumber true
This alias can help too:
git config --global alias.g "grep --break --heading --line-number"
Update August 2016: R.M. recommends in the comments
I got a "`fatal: bad flag '->' used after filename`" when trying the `git branch` version. The error was associated with a `HEAD` aliasing notation.
I solved it by adding a `sed '/->/d'` in the pipe, between the `tr` and the `xargs` commands.
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>
This is an improvement over the solution chernjie had suggested, since `git rev-list --all` is an overkill.
A more refined command can be:
# Don't use this, see above
git branch -a | tr -d \* | xargs git grep <regexp>
Which will allow you to search only branches (including remote branches)
You can even create a bash/zsh alias for it:
# Don't use this, see above
alias grep_all="git branch -a | tr -d \* | xargs git grep"
grep_all <regexp>
Jan. 2024: Gabriel Staples adds in the comments:
For anyone who wants to search just the tip commits on every branch in the repo, rather than every commit in the repo, and if you'd like to do parallel processes to speed up the search, see my very extensive answer here:
All about searching (via `grep` or similar) in your git repositories. I build upon some of the content in this answer.
Problem
Is it possible to run `git grep` inside all the branches of a Git control sourced project? Or is there another command to run?
Related problems
- How to grep (search through) committed code in the Git history
- How to iterate through all git branches using bash script
- What does the term "porcelain" mean in Git?
- Using Git, how could I search for a string across all branches?
- What to add to "git status --porcelain" to make it behave like "git status"?