Question Comment faire pour grep Git commit diffs ou contenu pour un certain mot?


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

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

mais cela ne me rend pas nécessairement le nom de fichier (sauf si c'est moins de 5 lignes loin du mot que j'ai cherché. J'ai aussi essayé

git grep "word"

mais cela ne me donne que des fichiers présents et non l'histoire.

Comment puis-je effectuer une recherche sur l'ensemble de l'historique afin de suivre les changements sur un mot en particulier? Je veux dire rechercher dans mon code source des occurrences de mot pour suivre les modifications (recherche dans l'historique des fichiers).


484
2017-08-26 20:34


origine


Réponses:


Si vous voulez trouver tous les commits où message de validation contient le mot donné, utiliser

$ git log --grep=word

Si vous voulez trouver tous les commits où "mot" a été ajouté ou enlevé dans le contenu du fichier (pour être plus précis: où le nombre d'occurrences de "mot" a changé), c'est-à-dire contenu de la validation, utilisez la recherche dite "pioche" avec

$ git log -Sword

En git moderne, il y a aussi

$ git log -Gword

chercher différences dont la ligne ajoutée ou supprimée correspond à "mot" (également contenu de la validation).

Notez que -G par défaut accepte une regex, tandis que -S accepte une chaîne, mais peut être modifié pour accepter les regex en utilisant le --pickaxe-regex.

Pour illustrer la différence entre -S<regex> --pickaxe-regex et -G<regex>, considérez 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);

Tandis que git log -G"regexec\(regexp" montrera ce commit, git log -S"regexec\(regexp" --pickaxe-regex ne le fera pas (parce que le nombre d'occurrences de cette chaîne n'a pas changé).


695
2017-08-27 10:41



git logla pioche trouvera des commits avec des changements, y compris "mot" avec git log -Sword


241
2017-08-26 20:46



Après beaucoup d'expérimentation, je peux recommander ce qui suit, qui montre les commits qui introduisent ou suppriment des lignes contenant une expression rationnelle donnée, et affiche les changements de texte dans chacun, avec des couleurs montrant les mots ajoutés et supprimés.

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

Prend un peu de temps pour courir ... ;-)


11
2017-09-04 16:12



Un autre moyen / syntaxe pour le faire est: git log -S "word"
Comme ça, vous pouvez rechercher par exemple git log -S "with whitespaces and stuff @/#ü !"


7
2018-02-11 23:03



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 une recherche.


6
2017-09-26 11:05



Pour utiliser le connecteur booléen sur l'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] * sur les messages de validation.


3
2018-04-01 12:14



vim-fugitif est polyvalent pour ce genre d'examen dans Vim.

Utilisation :Ggrep pour faire ça. Pour plus d'informations, vous pouvez installer vim-fugitive et chercher le turorial par :help Grep. Et cet épisode: explorer-l'-historique-d'-un-git-dépôt vous guidera pour faire tout cela.


2
2017-07-09 06:49



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

Voici l'essentiel de l'article:

le BFG Repo-Cleaner est une alternative plus rapide et plus simple à git filter-branch pour supprimer les données indésirables. Par exemple, pour supprimer votre fichier avec des données sensibles et laisser votre dernier commit intact, lancez:

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

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

bfg --replace-text passwords.txt

Voir le La documentation de BFG Repo-Cleaner pour une utilisation complète et télécharger des instructions.


0
2018-05-27 20:33