web-dev-qa-db-fra.com

Avec git, comment puis-je rechercher une chaîne dans toutes les branches?

Avec git, comment puis-je rechercher dans une chaîne donnée tous les fichiers de toutes les branches locales?

Spécifique à Github: est-il possible d'effectuer la recherche ci-dessus dans toutes les branches de github? (Il y a plusieurs succursales distantes sur mon dépôt github distant qui, idéalement, ne devrait pas être détruit pour cette recherche ..)

137
Ivar

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

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

La recherche avancée Github a une capacité de recherche de code:

La recherche de code examinera 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:
140
manojlds

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

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

alors vous devriez utiliser xargs:

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

Voir aussi Comment grep (recherche) le code engagé dans l'historique git?

103
teastburn

Dans de nombreux cas git rev-list --all peut renvoyer un nombre considérable de commits prenant un temps indéterminé à analyser. Si vous préférez effectuer une recherche dans tous les conseils de branche au lieu de chercher dans chaque commit de chaque branche de l'historique de votre référentiel, vous pouvez le remplacer par git show-ref --heads. Donc au total:

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

ou:

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

Astuce: Vous pouvez écrire une sortie dans un fichier à afficher dans l'éditeur.

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

Il y a peu de problèmes avec les solutions listées ici (même acceptées).

  1. Vous n'avez pas besoin de répertorier tous les hachages car vous obtiendrez des doublons, cela prend également plus de temps.

Il s’appuie sur ceci où vous pouvez rechercher une chaîne "test -f /" sur plusieurs branches master et dev as

git grep "test -f /" master dev

qui est identique à

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

Alors voilà.

Ceci trouve les hachages pour la pointe de toutes les branches locales et recherche uniquement dans ces commits.

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

Si vous devez également rechercher dans les succursales distantes, ajoutez -a:

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

Mise à jour:

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

Tu peux essayer ça

git log -Sxxxx  #search all commits
git log -Sxxxx  --branches[=<pattern>]   #search branches
3
Victor Choy