J'ai supprimé un fichier ou du code dans un fichier dans le passé. Puis-je grep dans le contenu (pas dans les messages de commit)?
Une très mauvaise solution consiste à grep le journal:
git log -p | grep <pattern>
Cependant, cela ne renvoie pas immédiatement le hachage de validation. J'ai joué git grep
sans succès.
git log -S
et du blâme) * [Amusant avec "git log --grep"] [2] (recherche de messages de validation ) * [Amusant avec "git grep"] [3] [2]: gitster.livejournal.com/30195.html [3]: gitster.livejournal.com/27674.htmlRéponses:
Pour rechercher du contenu de validation (c'est-à-dire des lignes de source réelles, par opposition aux messages de validation et autres), vous devez faire:
git rev-list --all | xargs git grep <expression>
fonctionnera si vous rencontrez une erreur "Liste d'arguments trop longue".Si vous voulez limiter la recherche à un sous-arbre (par exemple, "lib / util"), vous devrez le passer à la
rev-list
sous-commande etgrep
aussi:Cela va parcourir tout votre texte de validation pour
regexp
.La raison du passage du chemin dans les deux commandes est parce
rev-list
que renverra la liste des révisions où toutes les modifications se sontlib/util
produites, mais vous devez également passer àgrep
afin qu'il ne recherche quelib/util
.Imaginez simplement le scénario suivant:
grep
pourrait trouver la même chose<regexp>
sur d'autres fichiers qui sont contenus dans la même révision retournée parrev-list
(même s'il n'y a eu aucune modification de ce fichier sur cette révision).Voici d'autres moyens utiles de rechercher votre source:
Rechercher dans l'arborescence de travail le texte correspondant à l'expression rationnelle expression régulière:
Recherchez dans l'arborescence de travail des lignes de texte correspondant à l'expression régulière regexp1 ou regexp2:
Recherchez dans l'arborescence de travail les lignes de texte correspondant aux expressions régulières regexp1 et regexp2, en signalant uniquement les chemins d'accès aux fichiers:
Recherchez dans l'arborescence de travail des fichiers contenant des lignes de texte correspondant à l'expression régulière regexp1 et des lignes de texte correspondant à l'expression régulière regexp2:
Recherchez dans l'arbre de travail les lignes modifiées du modèle de correspondance de texte:
Rechercher toutes les révisions pour le texte correspondant à l'expression rationnelle expression régulière:
Rechercher toutes les révisions entre rev1 et rev2 pour le texte correspondant à l'expression régulière expression régulière:
la source
sh.exe": /bin/git: Bad file number
. La réponse de VonC fonctionne également avec msysgit.git gc
ou consultez: stackoverflow.com/questions/1507463/…Vous devez utiliser l' option pickaxe (
-S
) degit log
.Pour rechercher
Foo
:Voir l' historique Git - recherchez la ligne perdue par mot-clé pour en savoir plus.
Comme l'a commenté Jakub Narębski :
cela recherche les différences qui introduisent ou suppriment une instance de
<string>
. Cela signifie généralement "révisions où vous avez ajouté ou supprimé la ligne avec 'Foo'".l'
--pickaxe-regex
option vous permet d'utiliser l'expression régulière POSIX étendue au lieu de rechercher une chaîne. Exemple (degit log
):git log -S"frotz\(nitfol" --pickaxe-regex
Comme Rob l'a commenté, cette recherche est sensible à la casse - il a ouvert une question de suivi sur la façon de rechercher sans tenir compte de la casse.
la source
git log
bit dans votre question m'a confus;)-p
drapeau pour produire également le diff.--branches --all
options pour rechercher le tout repo.Ma façon préférée de le faire est avec
git log
l'-G
option de (ajoutée dans la version 1.7.4).Il existe une différence subtile entre la façon dont les options
-G
et-S
déterminent si une validation correspond:-S
option compte essentiellement le nombre de fois que votre recherche correspond dans un fichier avant et après une validation. La validation est affichée dans le journal si les décomptes avant et après sont différents. Cela ne montrera pas, par exemple, les commits où une ligne correspondant à votre recherche a été déplacée.-G
option, la validation est affichée dans le journal si votre recherche correspond à une ligne ajoutée, supprimée ou modifiée.Prenez ce commit comme exemple:
Étant donné que le nombre de fois où "bonjour" apparaît dans le fichier est le même avant et après cette validation, il ne correspondra pas à l'utilisation
-Shello
. Cependant, comme il y a eu un changement dans une correspondance de lignehello
, le commit sera affiché en utilisant-Ghello
.la source
-p
option d'afficher un diff pour chaque commit. Ensuite, lorsque le journal est ouvert dans mon téléavertisseur, je recherche tout ce que je recherche. Si votre téléavertisseur estless
et vousgit log -Ghello -p
, vous pouvez taper/hello
, appuyerEnter
et utilisern
etN
pour rechercher les occurrences suivantes / précédentes de "bonjour".-G
Regex: si la ligne de commande utilise UTF-8 et que le fichier que vous regardez utilise un codage ISO-latin (8 bits),.*
échoue. Par exemple, j'ai un changementVierter Entwurf
->Fünfter Entwurf
, et tout en'V.*ter Entwurf'
produisant une correspondance,'F.*ter Entwurf'
non.Si vous voulez parcourir les changements de code (voir ce qui a réellement été changé avec le mot donné dans toute l'histoire), optez pour le
patch
mode - j'ai trouvé une combinaison très utile de faire:la source
git log
peut être un moyen plus efficace de rechercher du texte dans toutes les branches, en particulier s'il existe de nombreuses correspondances, et que vous souhaitez voir les modifications les plus récentes (pertinentes) en premier.Ces commandes de liste des commandes de journalisation ajoutent ou suppriment la chaîne de recherche / l'expression régulière donnée (généralement) la plus récente en premier. L'
-p
option permet d'afficher le diff correspondant à l'endroit où le modèle a été ajouté ou supprimé, afin que vous puissiez le voir dans son contexte.Après avoir trouvé une validation pertinente qui ajoute le texte que vous recherchez (par exemple, 8beeff00d), recherchez les branches qui contiennent la validation:
la source
'
guillemets ne regroupent pas votre chaîne de recherche en un seul argument. Au lieu de cela,'public
l'argument est-S
et traite le reste comme des arguments séparés. Je ne sais pas dans quel environnement vous exécutez, mais ce contexte serait nécessaire pour aider au dépannage. Je suggère d'ouvrir une question StackOverflow distincte si nécessaire pour vous aider à dépanner, avec tout le contexte de la façon dont votre commande git est envoyée au shell. Il me semble que ça se fait via une autre commande? Les commentaires ici ne sont pas le bon endroit pour comprendre cela.J'ai pris la réponse de Jeet et l' ai adaptée à Windows (grâce à cette réponse ):
Notez que pour moi, pour une raison quelconque, la validation réelle qui a supprimé cette expression régulière n'apparaissait pas dans la sortie de la commande, mais plutôt une validation avant celle-ci.
la source
--no-pager
à la commande git à la fin>>results.txt
pour ceux qui ne connaissent pas la tuyauterie Windows ...Rechercher dans n'importe quelle révision, n'importe quel fichier :
Rechercher uniquement dans certains fichiers donnés, par exemple des fichiers XML:
Les lignes de résultat doivent ressembler à ceci: 6988bec26b1503d45eb0b2e8a4364afb87dde7af: bla.xml: texte de la ligne trouvée ...
Vous pouvez ensuite obtenir plus d'informations comme l'auteur, la date et la différence en utilisant
git show
:la source
Pour plus de simplicité, je suggère d'utiliser GUI: gitk - Le navigateur du référentiel Git . C'est assez flexible
Et vous pouvez parcourir les résultats à l'aide des flèches haut / bas.
la source
Pour toute autre personne essayant de le faire dans Sourcetree , il n'y a pas de commande directe dans l'interface utilisateur (à partir de la version 1.6.21.0). Cependant, vous pouvez utiliser les commandes spécifiées dans la réponse acceptée en ouvrant Terminal fenêtre (bouton disponible dans la barre d'outils principale) et en les copiant / collant.
Remarque: la vue Recherche de Sourcetree peut partiellement effectuer une recherche de texte pour vous. Appuyez sur Ctrl+ 3pour accéder à la vue Recherche (ou cliquez sur l'onglet Recherche disponible en bas). À l'extrême droite, définissez Type de recherche sur Modifications de fichier , puis tapez la chaîne que vous souhaitez rechercher. Cette méthode présente les limitations suivantes par rapport à la commande ci-dessus:
la source
Chaque fois que je me retrouve chez vous, j'utilise la ligne de commande suivante:
Explication:
git log
- Dois-je écrire plus ici; il montre les journaux par ordre chronologique.-S "<words/phrases i am trying to find>"
- Il montre tous ces commits Git où n'importe quel fichier (ajouté / modifié / supprimé) a les mots / phrases que j'essaye de trouver sans les symboles '<>'.--all
- Pour appliquer et rechercher dans toutes les branches.--oneline
- Il comprime le journal Git sur une seule ligne.--graph
- Il crée le graphique des validations chronologiquement ordonnées.la source
La réponse de Jeet fonctionne dans PowerShell.
Ce qui suit affiche tous les fichiers, dans n'importe quel commit, qui contiennent un fichier
password
.la source
Alors, essayez-vous de parcourir les anciennes versions du code pour voir où quelque chose existe en dernier?
Si je faisais cela, j'utiliserais probablement git bissect . En utilisant bisect, vous pouvez spécifier une bonne version connue, une mauvaise version connue et un script simple qui vérifie si la version est bonne ou mauvaise (dans ce cas, un grep pour voir si le code que vous recherchez est présent ). L'exécution de cette fonction détectera la date de suppression du code.
la source
Scénario: vous avez fait un grand nettoyage de votre code en utilisant votre IDE. Problème: l'EDI a nettoyé plus qu'il ne le devrait et maintenant votre code ne compile pas (ressources manquantes, etc.)
Solution:
Il trouvera le fichier où "text_to_find" a été modifié.
Vous pouvez maintenant annuler cette modification et compiler votre code.
la source
est un ajustement à la solution de Jeet , donc il montre les résultats pendant qu'il recherche et pas seulement à la fin (ce qui peut prendre beaucoup de temps dans un grand référentiel).
la source
Dans mon cas, je devais rechercher un court commit et les solutions listées ne fonctionnaient malheureusement pas.
J'ai réussi à le faire avec (remplacer le token REGEX ):
la source