Est-il possible d'effectuer un grep recherche dans toutes les branches d'un projet Git?

est-il possible d'exécuter git grep à l'intérieur de toutes les branches d'un projet de source de contrôle Git? Ou est-il une autre commande à exécuter?

96
demandé sur Peter Mortensen 2013-03-08 14:58:37

6 réponses

à La question " Comment grep (recherche) commis de code dans l'historique de git? "recommande:

 git grep <regexp> $(git rev-list --all)

qui recherche à travers toutes les commits, ce qui devrait inclure toutes les branches.

une autre forme serait:

git rev-list --all | (
    while read revision; do
        git grep -F 'yourWord' $revision
    done
)

vous pouvez trouver encore plus d'exemple dans cet article :

j'ai essayé ci-dessus sur un projet assez grand que git s'est plaint de la taille de l'argument, donc si vous tombez dans ce problème, faire quelque chose comme:

git rev-list --all | (while read rev; do git grep -e <regexp> $rev; done)

(voir une alternative dans la dernière section de cette réponse, ci-dessous)

N'oubliez pas ces paramètres, si vous les voulez:

# Allow Extended Regular Expressions
git config --global grep.extendRegexp true
# Always Include Line Numbers
git config --global grep.lineNumber true

ce pseudonyme peut aussi aider:

git config --global alias.g "grep --break --heading --line-number"

Note: chernjie suggère que git rev-list --all est une exagération.

une commande plus raffinée peut être:

git branch -a | tr -d \* | xargs git grep <regexp>

qui vous permettra de rechercher seulement les branches (y compris les branches éloignées)

vous pouvez même créer un alias bash/zsh pour lui:

alias grep_all="git branch -a | tr -d \* | xargs git grep"
grep_all <regexp>

Mise À Jour Août 2016: R. M. recommande dans les commentaires

j'ai eu un " fatal: bad flag '->' used after filename " lors de la tentative de la git branch version. L'erreur était associée à une notation d'alias HEAD .

Je l'ai résolu en ajoutant un sed '/->/d' dans le tuyau, entre les commandes tr et xargs .

 git branch -a | tr -d \* | sed '/->/d' | xargs git grep <regexp>

C'est-à-dire:

alias grep_all="git branch -a | tr -d \* | sed '/->/d' | xargs git grep"
grep_all <regexp>
135
répondu VonC 2017-12-05 13:05:04

git log peut être un moyen plus efficace de rechercher du texte dans toutes les branches, surtout s'il y a beaucoup de correspondances, et vous voulez voir des changements plus récents (pertinents) d'abord.

git log -p --all -S 'search string'
git log -p --all -G 'match regular expression'

de Ces journaux de liste de commandes s'engage à ce que d'ajouter ou de supprimer la chaîne de recherche/regex, (en général) les plus récents en premier. L'option -p permet d'afficher la différence pertinente à l'endroit où le motif a été ajouté ou supprimé, de sorte que vous pouvez le voir en contexte.

ayant trouvé une propagation pertinente qui ajoute le texte que vous cherchiez (par ex. 8beeff00d), trouver les branches qui contiennent le commit:

git branch -a --contains 8beeff00d
34
répondu Edward Anderson 2014-10-07 00:24:27

j'ai trouvé cela très utile:

git grep -i foo `git for-each-ref --format='%(refname)' refs/`

vous devez ajuster les derniers arguments selon que vous voulez regarder seulement les branches distantes vs locales, i.e.:

  • git grep -i foo $(git for-each-ref --format='%(refname)' refs/remotes)
  • git grep -i foo $(git for-each-ref --format='%(refname)' refs/heads)

l'alias que j'ai créé ressemble à ceci:

grep-refs = !sh -c 'git grep ""151910920"" "$@" "$(git for-each-ref --format=\"%(refname)\"" refs/)'
18
répondu errordeveloper 2014-01-22 13:51:41

même le sujet est vieux, mais je veux partager mon travail pour le reste qui pourrait le trouver utile (comme moi):

il est possible de le faire de deux façons: Bash ou git alias

voici 3 commandes:

  1. git grep-branch - recherche dans toutes les branches local et à distance
  2. git grep-branch-local - recherche dans les branches locales seulement
  3. git grep-branch-remote - branches éloignées uniquement

L'Usage est le même que git grep

git grep-branch "find my text"
git grep-branch --some-grep-options "find my text"

à l'aide de GREP: Git alias

File ~/.gitconfig

Les commandes

doivent être ajoutées manuellement au fichier ~/.gitconfig , car git config --global alias évalue le code complexe que vous ajoutez et le salissez.


[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 "

Note: Lorsque vous ajoutez des Alias et qu'ils ne parviennent pas à run-check backslashes \ ils peuvent avoir besoin d'une escape supplémentaire \ par rapport aux commandes bash .

  • git branch -a - afficher toutes les branches;
  • sed -e 's/[ \*]*//' - Trim espaces (de branch -a ) et * (nom de la branche active l'ont);
  • grep -v -e '\->' - ignorer les noms complexes comme remotes/origin/HEAD -> origin/master ;
  • grep '^remotes' - Obtenir toutes les branches éloignées;
  • grep -v -e '^remotes' - Obtenir les branches sauf branches distantes;

exemple git grep-branch-local -n getTastyCookies

-n préfixe le numéro de ligne aux lignes correspondantes.

[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)

la structure actuelle est:

: - séparateur

  1. branche: dev
  2. numéro de ligne: 53
  3. chemin d'accès au Fichier: modules/factory/getters.php
  4. ligne correspondante: function getTastyCookies($user)

à l'aide de GREP: BASH

comme vous devez le savoir: les commandes Bash doivent être stockées dans des scripts .sh ou exécutées dans un shell.

succursales locales seulement

git branch -a | sed -e 's/[ \*]*//' | grep -v -e '\->' -e '^remotes' | xargs git grep "TEXT"

branches éloignées seulement

git branch -a | sed -e 's/[ \*]*//' | grep -v -e '\->' | grep '^remotes' | xargs git grep "TEXT"

succursales locales et éloignées

git branch -a | sed -e 's/[ \*]*//' | grep -v -e '\->' | xargs git grep "TEXT"
4
répondu Devaldo 2017-01-27 16:17:04

si vous donnez une commit SHA1 à git grep vous l'avez rechercher dans eux, au lieu de la copie de travail.

pour rechercher toutes les branches vous pouvez obtenir tous les arbres avec git rev-list --all . Mettez tout avec

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

... et ayez de la patience

3
répondu CharlesB 2013-03-08 11:46:28

Voici comment je le fais:

git for-each-ref --format='%(*refname)' | xargs git grep SEARCHTERM
3
répondu William Entriken 2015-09-24 15:51:16