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).
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, ®match, 0); ... - hit = !regexec(regexp, mf2.ptr, 1, ®match, 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é).
La pioche de git log
trouvera les commits avec des modifications incluant "Word" avec git log -Sword
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 ... ;-)
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 @/#ü !"
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.
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.
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.
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.