Est-il possible d'exécuter git grep
à l'intérieur de toutes les branches d'un projet sourcé sous contrôle Git ? Ou y a-t-il une autre commande à exécuter ?
Réponses
Trop de publicités?La question " Comment faire une recherche dans l'historique git ? " recommande :
git grep <regexp> $(git rev-list --all)
Cela recherche dans tous 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'exemples dans cet article :
J'ai essayé ce qui précède sur un projet suffisamment grand pour que git se plaigne de la taille de l'argument, donc si vous rencontrez ce problème, faites 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
Cet alias peut aussi vous aider :
git config --global alias.g "grep --break --heading --line-number"
Mise à jour en août 2016 : R.M. recommande dans les commentaires
J'ai un "
fatal: bad flag '->' used after filename
" lors de l'essai de lagit branch
version. L'erreur était associée à uneHEAD
notation de l'aliasing.Je l'ai résolu en ajoutant un
sed '/->/d'
dans le tuyau, entre letr
et lexargs
des commandes.
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>
C'est une amélioration par rapport à la solution chernjie avait Proposition de ya que git rev-list --all
est une surenchère.
Une commande plus raffinée peut être :
# Don't use this, see above
git branch -a | tr -d \* | xargs git grep <regexp>
Ce qui vous permettra de rechercher uniquement les branches (y compris les branches distantes)
Vous pouvez même créer un alias bash/zsh pour celui-ci :
# Don't use this, see above
alias grep_all="git branch -a | tr -d \* | xargs git grep"
grep_all <regexp>
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 que vous voulez voir les changements les plus récents (pertinents) en premier.
git log -p --all -S 'search string'
git log -p --all -G 'match regular expression'
Ces commandes de journal listent les commits qui ajoutent ou suppriment la chaîne de recherche/regex donnée, (généralement) les plus récents en premier. Le site -p
permet d'afficher le diff correspondant à l'endroit où le motif a été ajouté ou supprimé, afin que vous puissiez le voir dans son contexte.
Après avoir trouvé un commit pertinent qui ajoute le texte que vous recherchez (par exemple 8beeff00d), trouvez les branches qui contiennent le commit :
git branch -a --contains 8beeff00d
J'ai trouvé cela très utile :
git grep -i foo `git for-each-ref --format='%(refname)' refs/`
Vous devrez ajuster les derniers arguments selon que vous voulez seulement regarder les branches distantes ou locales, c'est à dire :
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 "$0" "$@" "$(git for-each-ref --format=\"%(refname)\"" refs/)'
Il est possible de le faire de deux manières courantes : Les alias Bash ou Git
Voici trois commandes :
-
git grep-branch
- Recherche dans toutes les filiales locales et distantes -
git grep-branch-local
- Recherche dans les agences locales uniquement -
git grep-branch-remote
- Succursales distantes uniquement
L'utilisation est la même que git grep
git grep-branch "find my text"
git grep-branch --some-grep-options "find my text"
GREP utilisant : les alias de Git
Fichier ~/.gitconfig
Les commandes doivent être ajoutées manuellement à ~/.gitconfig
car git config --global alias
d'évaluer le code complexe que vous ajoutez et de le gâcher.
[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 fonctionnent pas, vérifiez les backslashes. \
ils peuvent avoir besoin d'une évasion supplémentaire \\
en comparaison avec bash des commandes.
-
git branch -a
- Afficher toutes les branches ; -
sed -e 's/[ \\*]*//'
- Garniture espaces (debranch -a
) et * (nom de la branche active) ; -
grep -v -e '\\->'
- Ignorer les noms complexes commeremotes/origin/HEAD -> origin/master
; -
grep '^remotes'
- Obtenez toutes les branches distantes ; -
grep -v -e '^remotes'
- Obtenir des branches sauf les branches distantes ;
Exemple git grep-branch-local -n getTastyCookies
-n
Préfixez le numéro de la 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 la suivante :
:
- Séparateur
- Branche :
dev
- Numéro de ligne :
53
- Chemin du fichier :
modules/factory/getters.php
- Ligne assortie :
function getTastyCookies($user)
GREP utilisant : BASH
Comme vous devez le savoir : les commandes Bash doivent être stockées dans .sh
scripts ou exécuté dans un shell.
Succursales locales uniquement
git branch -a | sed -e 's/[ \*]*//' | grep -v -e '\->' -e '^remotes' | xargs git grep "TEXT"
Succursales distantes uniquement
git branch -a | sed -e 's/[ \*]*//' | grep -v -e '\->' | grep '^remotes' | xargs git grep "TEXT"
Succursales locales et distantes
git branch -a | sed -e 's/[ \*]*//' | grep -v -e '\->' | xargs git grep "TEXT"
Si vous donnez à n'importe quel commit une valeur de hachage SHA-1 à git grep
vous avez la recherche en 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 cela avec
git grep "regexp" $(git rev-list --all)
... et avoir de la patience
- Réponses précédentes
- Plus de réponses