Comment grep Git commettre des diffs ou du contenu pour un certain mot?

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 donne pas nécessairement le nom du fichier (à moins que ce soit à moins de 5 lignes du mot que j’ai recherché. J’ai aussi essayé

 git grep "word" 

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

Comment rechercher l’historique complet pour suivre les changements sur un mot particulier? Je veux dire rechercher dans mon code source des occurrences de mot pour suivre les modifications (recherche dans l’historique des fichiers).

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

 $ git log --grep=word 

Si vous voulez trouver tous les commits où “mot” a été ajouté ou supprimé dans le contenu du fichier (pour être plus précis: où le nombre d’occurrences de “mot” a changé),

 $ git log -Sword 

Dans git moderne il y a aussi

 $ git log -Gword 

rechercher les différences dont la ligne ajoutée ou supprimée correspond à “mot” (également valider le contenu ).

Notez que -G accepte par défaut une expression régulière, tandis que -S accepte une chaîne, mais peut être modifié pour accepter les expressions rationnelles utilisant --pickaxe-regex .

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

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

la pioche de git log trouvera des commits avec des changements comprenant “mot” avec le git log -Sword

Après beaucoup d’expérimentation, je peux recommander les éléments suivants, qui montrent les modifications qui introduisent ou suppriment des lignes contenant une expression rationnelle donnée, et qui affichent les modifications de texte, les couleurs affichant les mots ajoutés et supprimés.

 git log --pickaxe-regex -p --color-words -S "" 

Ça prend un peu de temps à courir … 😉

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

Vous pouvez essayer la commande suivante:

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

ou en utilisant grep de la manière suivante:

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

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

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

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

Cette expression régulière recherche l’expression régulière [0-9] * ou [az] * sur les messages de validation.

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

Utilisez :Ggrep pour faire ça. Pour plus d’informations, vous pouvez installer vim-fugitive et consulter le site de :help Grep . Et cet épisode: explorer-l’histoire-de-un-git-repository vous guidera pour faire tout cela.

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

Voici l’essentiel de l’article:

BFG Repo-Cleaner est une alternative plus rapide et plus simple que git filter-branch pour supprimer des données indésirables. Par exemple, pour supprimer votre fichier avec des données sensibles et laisser votre dernière validation intacte, exécutez:

 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 

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