Cela parcourt tous les commits, qui devraient 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 soit plaint de la taille de l'argument, donc si vous rencontrez ce problème, faites quelque chose comme:
Ce n'est pas une bonne idée de diriger la sortie de git branchdans tr ou sed; git branchest une commande en porcelaine destinée à la consommation humaine. Voir stackoverflow.com/a/3847586/2562319 pour les alternatives préférées.
Ouais, bien. En regardant à travers les autres réponses, je pense que la réponse de @errordeveloper est la plus propre: stackoverflow.com/a/21284342/2562319 : "git grep <regexp> $ (git for-each-ref --format = '% (refname) 'refs /) "
jbyler
1
Existe-t-il un moyen d'afficher le nom de la branche qui correspond à la recherche?
franksands
63
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 d'abord voir les modifications les plus récentes (pertinentes).
Ces commandes de journal répertorient les commits qui ajoutent ou suppriment la chaîne de recherche / expression régulière donnée, (généralement) plus récente en premier. L' -poption permet d'afficher le diff pertinent à l'endroit où le modèle 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 recherchiez (par exemple 8beeff00d), trouvez les branches qui contiennent le commit:
Alias intéressant. +1. Plus précis que dans ma réponse.
VonC le
Comment faire fonctionner votre alias pour la recherche de phrases? Quand je passe "foo bar" comme paramètre, j'obtiens: fatal: argument ambigu "bar": révision inconnue ou chemin non dans l'arbre de travail. Utilisez '-' pour séparer les chemins des révisions
jutky
Essayez d'échapper à l'espace: "foo \ bar"
Garry Gomez
Ce sera clairement la réponse acceptée;) Je l'ai développé pour rechercher uniquement dans les dernières branches de mon projet (Vous avez plus de 500, ne demandez pas, et chaque grep prend environ 4 secondes, donc je ne veux ni n'en ai besoin pour rechercher plus de, disons, 100 derniers d'entre eux). Pour cela, j'ai mis à jour le git for-each-refavec --sort=-committerdate --count=100! Merci pour l'idée originale!
Vser le
6
Il est possible de le faire de deux manières courantes: alias Bash ou Git
Voici trois commandes:
git grep-branch - Recherche dans toutes les succursales locales et distantes
git grep-branch-local - Recherche dans les succursales locales uniquement
git grep-branch "find my text"
git grep-branch --some-grep-options "find my text"
GREP utilisant: alias Git
Fichier ~ / .gitconfig
Les commandes doivent être ajoutées manuellement au ~/.gitconfigfichier, car git config --global aliasévaluer le code complexe que vous ajoutez et le gâcher.
Remarque: lorsque vous ajoutez des alias et qu'ils ne s'exécutent pas - vérifiez les antislashs, \ils peuvent nécessiter un échappement supplémentaire \\par rapport aux commandes bash .
git branch -a - Afficher toutes les branches;
sed -e 's/[ \\*]*//'- Coupez les espaces (de branch -a) et * (le nom de la branche active l'a);
grep -v -e '\\->'- Ignorez les noms complexes comme remotes/origin/HEAD -> origin/master;
grep '^remotes' - Obtenez toutes les branches distantes;
grep -v -e '^remotes'- Obtenez des succursales sauf les succursales distantes;
Exemple git grep-branch-local -n getTastyCookies
-n Préfixez le numéro de ligne aux lignes correspondantes.
Cela semble bien, mais j'ai eu cette erreur de git grep-branch "find my text":fatal: ambiguous argument 'client': both revision and filename
nealmcb
Pourquoi toujours utiliser -a, qui montre toutes les branches? Je suggérerais d'utiliser des options pour la git branchcommande pour séparer les braches. Quand on regarde les succursales locales, il n'y en a qu'une seule *, donc pas besoin d'y échapper pour sed. Donc: git branch | sed -e 's/*/ /' | xargs git grep "TEXT"pour les succursales locales seulement, git branch -r | grep -v -- "->" | xargs git grep "TEXT"pour les succursales éloignées seulement et git branch -a | grep -v -- "->" | xargs git grep "TEXT"pour toutes les succursales
Réponses:
La question " Comment grep (rechercher) du code commis dans l'historique git? " Recommande:
Cela parcourt tous les commits, qui devraient inclure toutes les branches.
Une autre forme serait:
Vous pouvez trouver encore plus d'exemples dans cet article :
(voir une alternative dans la dernière section de cette réponse, ci-dessous)
N'oubliez pas ces paramètres, si vous les voulez:
Cet alias peut également aider:
Remarque: chernjie a suggéré que
git rev-list --all
c'est une exagération.Mise à jour août 2016: RM recommande dans les commentaires
C'est:
la source
git branch
dans tr ou sed;git branch
est une commande en porcelaine destinée à la consommation humaine. Voir stackoverflow.com/a/3847586/2562319 pour les alternatives préférées.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 d'abord voir les modifications les plus récentes (pertinentes).Ces commandes de journal répertorient les commits qui ajoutent ou suppriment la chaîne de recherche / expression régulière donnée, (généralement) plus récente en premier. L'
-p
option permet d'afficher le diff pertinent à l'endroit où le modèle 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 recherchiez (par exemple 8beeff00d), trouvez les branches qui contiennent le commit:
la source
J'ai trouvé cela très utile:
Vous auriez besoin d'ajuster les derniers arguments selon que vous ne voulez regarder que 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:
la source
git for-each-ref
avec--sort=-committerdate --count=100
! Merci pour l'idée originale!Il est possible de le faire de deux manières courantes: alias Bash ou Git
Voici trois commandes:
git grep-branch
- Recherche dans toutes les succursales locales et distantesgit grep-branch-local
- Recherche dans les succursales locales uniquementgit grep-branch-remote
- Succursales distantes uniquementL'utilisation est la même que
git grep
GREP utilisant: alias Git
Fichier ~ / .gitconfig
Les commandes doivent être ajoutées manuellement au
~/.gitconfig
fichier, cargit config --global alias
évaluer le code complexe que vous ajoutez et le gâcher.Remarque: lorsque vous ajoutez des alias et qu'ils ne s'exécutent pas - vérifiez les antislashs,
\
ils peuvent nécessiter un échappement supplémentaire\\
par rapport aux commandes bash .git branch -a
- Afficher toutes les branches;sed -e 's/[ \\*]*//'
- Coupez les espaces (debranch -a
) et * (le nom de la branche active l'a);grep -v -e '\\->'
- Ignorez les noms complexes commeremotes/origin/HEAD -> origin/master
;grep '^remotes'
- Obtenez toutes les branches distantes;grep -v -e '^remotes'
- Obtenez des succursales sauf les succursales distantes;Exemple
git grep-branch-local -n getTastyCookies
-n
Préfixez le numéro de ligne aux lignes correspondantes.La structure actuelle est:
:
- Séparateurdev
53
modules/factory/getters.php
function getTastyCookies($user)
GREP utilisant: BASH
Comme vous devez le savoir: les commandes Bash doivent être stockées dans des
.sh
scripts ou exécutées dans un shell.Succursales locales uniquement
Succursales distantes uniquement
Succursales locales et distantes
la source
git grep-branch "find my text"
:fatal: ambiguous argument 'client': both revision and filename
-a
, qui montre toutes les branches? Je suggérerais d'utiliser des options pour lagit branch
commande pour séparer les braches. Quand on regarde les succursales locales, il n'y en a qu'une seule*
, donc pas besoin d'y échapper pour sed. Donc:git branch | sed -e 's/*/ /' | xargs git grep "TEXT"
pour les succursales locales seulement,git branch -r | grep -v -- "->" | xargs git grep "TEXT"
pour les succursales éloignées seulement etgit branch -a | grep -v -- "->" | xargs git grep "TEXT"
pour toutes les succursalesVoici comment je fais:
la source
Si vous donnez à un commit une valeur de hachage SHA-1,
git grep
vous le faites chercher à l'intérieur, 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... et ayez de la patience
la source