Using Git, how could I search for a string across all branches?

前端 未结 5 1987
一个人的身影
一个人的身影 2020-12-22 15:25

Using Git, how could I search within all files in all local branches for a given string?

GitHub specific: is it possible to perform the above search across all GitHu

相关标签:
5条回答
  • 2020-12-22 15:47

    You can try this:

    git log -Sxxxx  # Search all commits
    git log -Sxxxx  --branches[=<pattern>]   # Search branches
    
    0 讨论(0)
  • 2020-12-22 15:54

    There are a few issues with the solutions listed here (even accepted).

    You do not need to list all the hashes as you'll get duplicates. Also, it takes more time.

    It builds on this where you can search a string "test -f /" on multiple branches master and dev as

    git grep "test -f /" master dev
    

    which is same as

    printf "master\ndev" | xargs git grep "test -f /"
    

    So here goes.

    This finds the hashes for the tip of all local branches and searches only in those commits:

    git branch -v --no-abbrev | awk -F' *' '{print $3}' | xargs git grep "string/regexp"
    

    If you need to search in remote branches too then add -a:

    git branch -a -v --no-abbrev | awk -F' *' '{print $3}' | xargs git grep "string/regexp"
    

    Further:

    # Search in local branches
    git branch | cut -c3- | xargs git grep "string"
    
    # Search in remote branches
    git branch -r | cut -c3- | xargs git grep "string"
    
    # Search in all (local and remote) branches
    git branch -a | cut -c3- | cut -d' ' -f 1 | xargs git grep "string"
    
    # Search in branches, and tags
    git show-ref | grep -v "refs/stash" | cut -d' ' -f2 | xargs git grep "string"
    
    0 讨论(0)
  • 2020-12-22 15:59

    If you use @manojlds Git grep command and get an error:

    -bash: /usr/bin/git: Argument list too long" 
    

    then you should use xargs:

    git rev-list --all | xargs git grep "string/regexp"
    

    Also see How to grep (search) committed code in the Git history

    0 讨论(0)
  • 2020-12-22 16:02

    In many cases git rev-list --all can return a huge number of commits, taking forever to scan. If you, instead of searching through every commit on every branch in your repository history, just want to search all branch tips, you can replace it with git show-ref --heads. So in total:

    git grep "string" `git show-ref --heads`
    

    or:

    git show-ref --heads | xargs git grep "string"
    

    Tip: You can write output in file to view in an editor:

    nano ~/history.txt
    git show-ref --heads | xargs git grep "search string here" >> ~/history.txt
    
    0 讨论(0)
  • 2020-12-22 16:12

    You can do this on a Git repository:

    git grep "string/regexp" $(git rev-list --all)
    

    GitHub advanced search has code search capability:

    The code search will look through all of the code publicly hosted on GitHub. You can also filter by:

    • the language: language:
    • the repository name (including the username): repo:
    • the file path: path:
    0 讨论(0)
提交回复
热议问题