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
et--pickaxe-regex -G
, considérez 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 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.