Comment trouver le commit Git qui a introduit une chaîne dans n’importe quelle twig?

Je veux être en mesure de trouver une certaine chaîne qui a été introduite dans un commit dans une twig, comment puis-je le faire? J’ai trouvé quelque chose (que j’ai modifié pour Win32), mais git whatchanged ne semble pas regarder dans les différentes twigs (ignorer le bloc py3k, c’est juste un correctif de stream msys / win line)

 git whatchanged --  | \ grep "^commit " | \ python -c "exec(\"import sys,msvcrt,os\nmsvcrt.setmode(sys.stdout.fileno(), os.O_BINARY)\nfor l in sys.stdin: print(l.split()[1])\")" | \ xargs -i% git show origin % --  

Peu importe si votre solution est lente.

Tu peux faire:

 git log -S  --source --all 

Pour trouver tous les commits qui ont ajouté ou supprimé la chaîne fixe, Le paramètre --all signifie démarrer à partir de chaque twig et --source signifie indiquer laquelle de ces twigs a conduit à rechercher cette validation. Il est souvent utile d’append -p pour afficher les correctifs que chacun de ces commits introduirait également.

Les versions de git depuis 1.7.4 ont également une option -G similaire , qui prend une expression régulière . Cela a en fait une sémantique différente (et plutôt plus évidente), expliquée dans cet article de Junio ​​Hamano .

Comme le souligne thameera dans les commentaires, vous devez placer des guillemets autour du terme de recherche s’il contient des espaces ou d’autres caractères spéciaux, par exemple:

 git log -S 'hello world' --source --all git log -S "dude, where's my car?" --source --all 

Voici un exemple d’utilisation de -G pour trouver les occurrences de la function foo() { :

 git log -G "^(\s)*function foo[(][)](\s)*{$" --source --all 

–reverse est également utile car vous voulez que le premier commit qui a effectué le changement:

 git log --all -p --reverse --source -S 'needle' 

De cette façon, les anciens commits apparaîtront en premier.

La réponse de Mark Longair est excellente, mais j’ai trouvé cette version plus simple pour moi.

 git log -S whatever 

Défaire avec les mêmes réponses:

 $ git config --global alias.find '!git log --color -p -S ' 
  • ! est nécessaire car autrement, git ne transmet pas correctement l’argument à -S. Voir cette réponse
  • –color et -p aide à montrer exactement “ce qui change”

Maintenant tu peux faire

 $ git find  

ou

 $ git find  --all $ git find  master develop 
 git log -S"ssortingng_to_search" # options like --source --reverse --all etc 

Faites attention à ne pas utiliser d’espaces entre S et “ssortingng_to_search”. Dans certaines configurations (git 1.7.1), vous obtiendrez une erreur comme:

 fatal: ambiguous argument 'ssortingng_to_search': unknown revision or path not in the working tree. Use '--' to separate paths from revisions 

Bien que cela ne réponde pas directement à votre question, je pense que cela pourrait être une bonne solution pour vous dans le futur. J’ai vu une partie de mon code, ce qui était mauvais. Je ne savais pas qui l’avait écrit ou quand. Je pouvais voir tous les changements du fichier, mais il était clair que le code avait été déplacé d’un autre fichier vers celui-ci. Je voulais trouver qui l’a effectivement ajouté en premier lieu.

Pour ce faire, j’ai utilisé Git bisect , ce qui m’a rapidement permis de trouver le pécheur.

J’ai lancé git bisect start et puis git bisect bad , car la révision extraite avait le problème. Comme je ne savais pas quand le problème était survenu, j’ai ciblé le premier commit pour le “bon”, git bisect good .

Ensuite, j’ai juste continué à chercher le repo pour le mauvais code. Quand je l’ai trouvé, j’ai couru git bisect bad , et quand il n’y en avait pas: git bisect good .

En environ 11 étapes, j’avais couvert 1000 commits et trouvé le commit exact, où le problème avait été introduit. Assez bien