web-dev-qa-db-fra.com

Comment grep Git valider des diffs ou contenus pour un mot donné?

Dans un référentiel de code Git, je souhaite répertorier tous les commits contenant un certain mot. J'ai essayé ça

git log -p | grep --context=4 "Word"

mais cela ne me renvoie pas nécessairement le nom du fichier (à moins qu'il ne soit à moins de 5 lignes de lignes du mot que j'ai recherché. J'ai aussi essayé

git grep "Word"

mais cela ne me donne que les fichiers présents et non l'historique.

Comment rechercher dans l'historique complet afin de pouvoir suivre les modifications apportées à un mot particulier? Je veux rechercher dans ma base de code les occurrences de Word afin de suivre les modifications (recherche dans l'historique des fichiers).

529
Jesper Rønn-Jensen

Si vous voulez trouver tous les commits où commit message contient un mot donné, utilisez

$ git log --grep=Word

Si vous voulez trouver tous les commits pour lesquels "Word" a été ajouté ou supprimé dans le contenu du fichier (pour être plus exact: où le nombre d'occurrences de "Word" a été modifié), c.-à-d. Rechercher dans le contenu du commit utiliser la recherche dite "pioche" avec

$ git log -Sword

En git moderne il y a aussi

$ git log -Gword

rechercher différences dont la ligne ajoutée ou supprimée correspond à "Word" (également commit contents).

Notez que -G accepte par défaut une expression rationnelle, alors que -S accepte une chaîne, mais peut être modifié pour accepter les expressions rationnelles à l'aide de --pickaxe-regex.

Pour illustrer la différence entre -S<regex> --pickaxe-regex et -G<regex>, considérons un commit avec le diff suivant dans le même fichier:

+    return !regexec(regexp, two->ptr, 1, &regmatch, 0);
...
-    hit = !regexec(regexp, mf2.ptr, 1, &regmatch, 0);

Alors que git log -G"regexec\(regexp" affichera cette validation, git log -S"regexec\(regexp" --pickaxe-regex ne le fera pas (car le nombre d'occurrences de cette chaîne n'a pas changé).

777
Jakub Narębski

La pioche de git log trouvera les commits avec des modifications incluant "Word" avec git log -Sword

246
u0b34a0f6ae

Après de nombreuses expériences, je peux recommander ce qui suit, qui montre les commits qui introduisent ou suppriment les lignes contenant une expression rationnelle donnée, et affiche les modifications de texte dans chacune, avec des couleurs indiquant les mots ajoutés et supprimés. 

git log --pickaxe-regex -p --color-words -S "<regexp to search for>"

Cela prend du temps de courir ... ;-)

14
CharlesW

Une autre façon de procéder est la suivante: git log -S "Word"
Comme cela, vous pouvez rechercher par exemple git log -S "with whitespaces and stuff @/#ü !"

7
1u-

Vous pouvez essayer la commande suivante:

git log --patch --color=always | less +/searching_string

ou en utilisant grep de la manière suivante:

git rev-list --all | GIT_PAGER=cat xargs git grep 'search_string'

Exécutez cette commande dans le répertoire parent où vous souhaitez effectuer la recherche.

7
kenorb

Pour utiliser le connecteur booléen sur une expression régulière:

git log --grep '[0-9]*\|[a-z]*'

Cette expression régulière recherche l'expression régulière [0-9] * ou [a-z] * dans les messages de validation.

2
Reudismam

vim-fugitive est polyvalent pour ce type d’examen dans Vim. 

Utilisez :Ggrep pour le faire. Pour plus d'informations, vous pouvez installer vim-fugitive et rechercher le répertoire par :help Grep. Et cet épisode: explorer-l'histoire-d'un-dépôt-git vous guidera pour faire tout cela.

2
lerner

Si vous souhaitez rechercher des données sensibles afin de les supprimer de votre historique git (c'est la raison pour laquelle j'ai atterri ici), il existe des outils pour cela. Github en tant que une page d’aide dédiée à ce problème

Voici le résumé de l'article: 

Le BFG Repo-Cleaner est une alternative plus rapide et plus simple que git filter-branch pour la suppression des données indésirables. Par exemple, pour supprimer votre fichier contenant des données sensibles et laisser votre dernier commit intact, exécutez:

bfg --delete-files YOUR-FILE-WITH-SENSITIVE-DATA

Pour remplacer tout le texte répertorié dans passwords.txt partout où il se trouve dans l'historique de votre référentiel, exécutez:

bfg --replace-text passwords.txt

Consultez la documentation de BFG Repo-Cleaner pour une utilisation complète et les instructions de téléchargement.

0
edelans