235 votes

En utilisant Git, comment pourrais-je rechercher une chaîne dans toutes les branches ?

En utilisant Git, comment pourrais-je rechercher dans tous les fichiers de toutes les branches locales une chaîne de caractères donnée ?

Spécificité de GitHub : est-il possible d'effectuer la recherche ci-dessus dans toutes les branches de GitHub (il y a plusieurs branches distantes sur mon dépôt GitHub distant qu'idéalement je n'aurais pas à faire descendre pour cette recherche...).

1 votes

git-grep pourrait être ce que vous recherchez, mais je ne suis pas encore sûr des options dont vous auriez besoin...

0 votes

214voto

manojlds Points 96599

Vous pouvez le faire sur un dépôt Git :

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

La recherche avancée de GitHub permet la recherche de code :

La recherche de code passe en revue tout le code hébergé publiquement sur GitHub. Vous pouvez également filtrer par :

  • la langue : language:
  • le nom du référentiel (y compris le nom d'utilisateur) : repo:
  • le chemin du fichier : path:

0 votes

Cela me cause un défaut de segmentation. Cela pourrait être tortoisegitmerge (Windows), cependant.

9 votes

Ce n'est vraiment pas la meilleure façon de faire. Elle ne contrôle pas la quantité de refs git qui sont passées à git grep ... . Regardez les autres réponses, elles sont bien meilleures que celle-ci, même si elle est marquée comme la réponse acceptée !

1 votes

Il serait bien que vous puissiez ajouter un exemple pour vos filtres, par ex. path: Je suppose que c'est avant les guillemets dans votre exemple de requête ?

160voto

teastburn Points 175

Si vous utilisez la commande grep de @manojlds Git et obtenez une erreur :

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

alors vous devez utiliser xargs :

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

Voir aussi Comment faire une recherche dans l'historique de Git ?

0 votes

En outre, il semble être plus compatible avec d'autres types de consoles comme le fishshell.

4 votes

Merci ! !! en utilisant ZSH et cela a fonctionné alors que la commande @manojlds donnait l'erreur que vous avez mentionnée ! Mais attention, cela peut prendre TRES longtemps pour un gros repo avec un long historique.

0 votes

Si vous cherchez dans un fichier spécifique, vous pouvez utiliser : git rev-list --all | xargs -J % git grep "string/rexexp" % -- filename . Cela va lancer git grep sur les blocs de commits qui sont insérés là où le % apparaît.

91voto

Zitrax Points 3443

Dans de nombreux cas git rev-list --all peut retourner un nombre énorme de commits, prenant une éternité à analyser. Si, au lieu de rechercher tous les commits de chaque branche dans l'historique de votre dépôt, vous souhaitez simplement rechercher tous les bouts de branche, vous pouvez le remplacer par git show-ref -s --heads . Donc au total :

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

ou :

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

Conseil : Vous pouvez écrire la sortie dans un fichier pour la visualiser dans un éditeur :

nano ~/history.txt
git show-ref -s --heads | xargs git grep "search string here" >> ~/history.txt

9 votes

git show-ref --heads liste le hash et le nom de la référence, de sorte qu'il (2e ligne) cherchera deux fois. donc git show-ref --heads | cut -d' ' -f2 est meilleure car elle ne listera que les noms des références.

6 votes

Je n'arrive pas à croire le nombre de fois où cette question a été posée et répondue, et pourtant vous êtes le seul à avoir la réponse à cette question. correct réponse.

4 votes

git show-ref --heads -s produit uniquement le hachage SHA1. Aussi, s'il y a plusieurs branches qui pointent vers le même commit, vous aurez des doublons. Vous pouvez les supprimer avec sort -u comme suit git show-ref --heads -s | sort -u | xargs git grep ...

32voto

hIpPy Points 727

Les solutions proposées ici (même acceptées) posent quelques problèmes.

Il n'est pas nécessaire de répertorier tous les hachages car vous obtiendrez des doublons. En outre, cela prend plus de temps.

Il s'appuie sur cela pour rechercher une chaîne de caractères "test -f /" sur plusieurs branches master y dev comme

git grep "test -f /" master dev

qui est identique à

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

Alors voilà.

Cela trouve les hachages pour le bout de toutes les branches locales et ne cherche que dans ces commits :

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

Si vous avez besoin de rechercher dans les branches distantes également, ajoutez -a :

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

Plus loin :

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

16voto

user3762471 Points 1

Vous pouvez essayer ceci :

git log -Sxxxx  # Search all commits
git log -Sxxxx  --branches[=<pattern>]   # Search branches

7 votes

Dans toutes les branches : git log --all -s"search_string"

6 votes

Ci-dessus a besoin de la capitale S

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X