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?
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 lagit branch
version. L'erreur était associée à une notation d'aliasHEAD
.Je l'ai résolu en ajoutant un
sed '/->/d'
dans le tuyau, entre les commandestr
etxargs
.
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>
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
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/)'
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:
-
git grep-branch
- recherche dans toutes les branches local et à distance -
git grep-branch-local
- recherche dans les branches locales seulement -
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 (debranch -a
) et * (nom de la branche active l'ont); -
grep -v -e '\->'
- ignorer les noms complexes commeremotes/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
- branche:
dev
- numéro de ligne:
53
- chemin d'accès au Fichier:
modules/factory/getters.php
- 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"
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
Voici comment je le fais:
git for-each-ref --format='%(*refname)' | xargs git grep SEARCHTERM