147 votes

Git : Affiche toutes les modifications apportées à une seule ligne d'un fichier spécifié sur l'ensemble de l'historique git.

J'ai cherché, et je ne suis pas sûr que ce soit possible, mais je vais le faire :

J'ai un fichier (javascript) (disons /lib/client.js) dans lequel j'ai un identifiant unique var identifier = "SOME_IDENTIFIER";

Vous pouvez considérer l'identifiant comme un numéro de version : Périodiquement, nous remplacerons cette variable par un nouvel identifiant.

J'aimerais trouver tous les identificateurs uniques que nous avons utilisés. Comment puis-je faire cela avec git ?

J'imagine qu'il pourrait y avoir un moyen de rechercher dans l'historique git, et d'imprimer la ligne correspondant à "var identifier =" . Je pourrais dédupliquer cette liste manuellement.

Quoi qu'il en soit, j'apprécierais tout point de vue. Je vous remercie.

155voto

Alexander Bird Points 5334

Depuis Git 1.8.4, il existe un moyen plus direct de répondre à votre question.

En supposant que la ligne 110 est la ligne qui dit var identifier = "SOME_IDENTIFIER"; , puis procédez comme suit :

git log -L110,110:/lib/client.js

Cela renverra toutes les livraisons qui ont touché cette ligne de code.

Véase git-log pour la documentation de l -L paramètre de ligne de commande .

59voto

rob Points 804

Voir la page de manuel pour git-log y gitdiffcore . Je pense que cette commande devrait suffire, mais il se peut qu'elle ne soit pas tout à fait exacte :

git log -G "var identifier =" file.js

EDITAR: Voici un début de script bash script pour montrer les lignes actuelles. C'est peut-être ce que vous recherchez.

for c in $(git log -G "something" --format=%H -- file.js); do
    git --no-pager grep -e "something" $c -- file.js
done

Il utilise git log -G pour trouver les commits intéressants, en utilisant --format=%H pour produire une liste de hachages d'engagements. Il itère ensuite sur chaque livraison intéressante, en demandant à git grep pour afficher les lignes de ce commit et de ce fichier qui contiennent la regex, précédées du hash du commit.


EDITAR: Modifié pour utiliser -G au lieu de -S comme suggéré dans les commentaires.

14voto

Ethan Brown Points 10832

Vous pouvez également le faire avec gitk :

gitk file.js

Dans le menu déroulant "commit", choisissez "adding/removing string :" et dans la zone de texte à côté, entrez "var identifier =", et tous les commits qui ajoutent ou suppriment des lignes contenant cette chaîne seront mis en évidence.

10voto

Andrew Points 1022

Si vous adaptez un peu la réponse de @rob, git log fera essentiellement cela pour vous, si tout ce dont vous avez besoin est une comparaison visuelle :

git log -U0 -S "var identifier =" path/to/file

-U0 signifie sortie en mode patch ( -p ), et afficher zéro ligne de contexte autour du patch.

Vous pouvez même le faire pour plusieurs branches :

git log -U0 -S "var identifier =" branchname1 branchname2 -- path/to/file

Il existe peut-être un moyen de supprimer l'en-tête de la diff, mais je n'en connais pas.

5voto

slumos Points 51

En magit Vous pouvez le faire avec

l, =L

Il vous demandera alors d'indiquer le fichier et les lignes de début et de fin.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X