Git recherche une chaîne dans l'historique d'un seul fichier

173

Donc, si j'ai un fichier appelé foo.rb et qu'il me donne une erreur pour une méthode manquante appelée bar , je veux donc rechercher dans l'historique de foo.rb la chaîne barpour voir si elle a déjà été définie dans le passé.

J'ai trouvé cela Rechercher dans toute l'histoire de Git une chaîne

Mais cela recherche tous les fichiers. Je veux juste rechercher dans un fichier.

JD Isaacks
la source
6
Tout comme un FYI, vous pouvez ajouter -- filenameà un tas de commandes git si vous souhaitez le limiter à un fichier.
Karl Bielefeldt

Réponses:

235

Pour cela, vous pouvez utiliser l'option -S pour git log:

git log -S'bar' -- foo.rb
ralphtheninja
la source
39
Ou git log -G'bar' -- foo.rbpour rechercher un diff qui contient 'bar' plutôt que des commits qui ont changé le nombre d'occurrences de 'bar' (voir la page de manuel git-log).
Jakub Narębski
1
Cela n'a pas fonctionné pour moi avec les guillemets, j'ai dû l'utiliser -Sbarpour rechercher une barre . Peut-être que cela a quelque chose à voir avec moi en utilisant la ligne de commande Windows.
zbr
en d'autres termes, -Gc'est pour une recherche regex ... c'est aussi une excellente référence: stackoverflow.com/a/4472267/2586761
ptim
17

Ou peut-être que vous pouvez essayer celui-ci (à partir de questions connexes Rechercher dans tout l'historique de git pour la chaîne )

git rev-list --all foo.rb | (
    while read revision; do
        git grep -F 'bar' $revision foo.rb
    done
)

Il recherchera en fait le contenu du fichier et ne validera pas les messages / correctifs pour toute occurrence de bar.

Antoine Pélisse
la source
Pour Windows: for /F %i in ('git rev-list --all foo.rb') git grep -F bar %i foo.rb(surveillez les doubles guillemets si le nom de fichier ou la phrase de recherche contient des espaces)
biscuit314
1
Pour moi, dans Windows, cela n'a pas fonctionné sans "faire": for /F %i in ('git rev-list --all foo.rb') do git grep -F bar %i foo.rb (surveillez les guillemets si le nom de fichier ou la phrase de recherche contient des espaces)
xberger
2

Il y a un remplacement pour la commande git log (à partir du manuel ):

$ git log Makefile      # commits that modify Makefile

Vous pouvez donc utiliser:

git log foo.rb | grep "bar"
Dmitry Reznik
la source
2
Merci, mais cela recherche simplement l'historique des validations, pas l'historique de la source du fichier.
JD Isaacks
2
Il y a en fait un autre remplacement qui recherche le changement de données de chaîne: git log -S'foo () '# commits qui ajoutent ou suppriment toutes les données de fichier correspondant à la chaîne' foo () '
Dmitry Reznik
1
Vous pouvez également essayer d'utiliser le paramètre --full-diff. Les journaux affichent non seulement l'historique des validations, mais également les différences.
Dmitry Reznik
@DmitriyReznik - --full-diffne fonctionne apparemment pas (comme dans, aucun diff n'est montré) sans -p, au moins sur git 1.7.9.5
sdaau
0

J'ai utilisé git log -S "string" --follow -p "path of file"ce qui montre l'historique complet de tous les changements avec cette chaîne.

questions de pile
la source