Puis-je faire 'git diff' uniquement les numéros de ligne ET les noms de fichiers modifiés?

276

Cette question appelle des "numéros de ligne", si vous ne vous souciez pas des numéros de ligne dans la sortie, consultez cette question et sa réponse .


Fondamentalement, je ne veux pas voir le contenu modifié, juste les noms de fichiers et les numéros de ligne.

wei
la source
Je suis curieux, les numéros de ligne sont-ils vraiment utiles sans code? Ou voulez-vous que le nombre de lignes soit modifié?
Andrew Marshall
bien, pas particulièrement, mais j'en ai besoin pour mettre en signet où j'ai changé mon code.
wei
1
Une utilisation de ceci serait de combiner les informations avec un rapport de couverture de code, pour évaluer si le code nouveau ou modifié dans un commit est couvert par des tests
AntonyG
@AntonyG J'ai trouvé cette question en essayant de construire un utilitaire qui fait exactement la même chose (couverture vs lignes modifiées). Avez-vous réussi à créer le rapport? Si oui, l'avez-vous publié quelque part?
Andrew Newdigate
@AndrewNewdigate ce serait un outil sympa mais je ne l'ai jamais construit. Je faisais un autre type de traitement des résultats de la couverture de code lorsque je suis tombé sur cette question, mais je ne pouvais pas justifier le temps nécessaire pour mettre en œuvre ma suggestion
AntonyG

Réponses:

70

Remarque: si vous recherchez simplement les noms des fichiers modifiés ( sans les numéros de ligne des lignes qui ont été modifiées), c'est facile, cliquez sur ce lien pour une autre réponse ici .


Il n'y a pas d'option intégrée pour cela (et je ne pense pas que ce soit très utile non plus), mais il est possible de le faire dans git, à l'aide d'un script "diff externe".

Voici un assez merdique; ce sera à vous de fixer la sortie comme vous le souhaitez.

#! /bin/sh
#
# run this with:
#    GIT_EXTERNAL_DIFF=<name of script> git diff ...
#
case $# in
1) "unmerged file $@, can't show you line numbers"; exit 1;;
7) ;;
*) echo "I don't know what to do, help!"; exit 1;;
esac

path=$1
old_file=$2
old_hex=$3
old_mode=$4
new_file=$5
new_hex=$6
new_mode=$7

printf '%s: ' $path
diff $old_file $new_file | grep -v '^[<>-]'

Pour plus de détails sur "diff externe", voir la description de GIT_EXTERNAL_DIFFla page de manuel de git (autour de la ligne 700, assez proche de la fin).

torek
la source
1
Merci. En fait, j'ai écrit un script similaire, après avoir été confirmé qu'il n'y avait pas d'options intégrées pour cela, :)
wei
La tuyauterie | grep -o '^[0-9]*'vous donne juste des chiffres, en supposant que vous ne vous souciez pas du côté droit.
GKFX
1
@DylanYoung yes; pour limiter les fichiers affichés, ajoutez --diff-filter=...où la ...pièce correspond au type de changements que vous souhaitez voir: Mpour modifié, Apour ajouté, Dpour supprimé et autres selon la git diffdocumentation.
torek
@Sventies: ce n'est pas ce que le PO a demandé, comme je le note en haut de ma réponse. Il ne veut pas seul le nom des fichiers. Il veut les noms avec des numéros de ligne .
torek
Assez bien @torek :)
Sventies
833

Si facile:

git diff --name-only

Allez-y et diff!

phreakhead
la source
88
C'est probablement la réponse que la plupart des gens recherchent lorsqu'ils consultent cette page (c'était pour moi). Cependant, il ne répond pas à la question d'origine, qui mentionne spécifiquement les numéros de ligne.
Pieter Müller
12
Cela ne devrait PAS être la réponse acceptée car cela ne résout que la moitié du problème - vous devez toujours afficher les lignes (pour chaque fichier) qui ont été modifiées.
adamwong246
C'est tout! Je cherchais exactement cet interrupteur!
Adam Arold
Pourquoi ne pas utiliser "git status"? Il vous indique également les fichiers non suivis.
Naveen Paul
1
@JimmyPaul parce que parfois vous vous êtes déjà engagé. Par exemple, vous devez répertorier le fichier modifié entre le maître et votre branche avancée actuellegit diff --name-only master..HEAD
Hettomei
68

Numéros de ligne comme en nombre de lignes modifiées ou les numéros de ligne réels contenant les modifications? Si vous voulez le nombre de lignes modifiées, utilisez git diff --stat. Cela vous donne un affichage comme celui-ci:

[me@somehost:~/newsite:master]> git diff --stat
 whatever/views/gallery.py |    8 ++++++++
 1 files changed, 8 insertions(+), 0 deletions(-)

Il n'y a pas d'option pour obtenir les numéros de ligne des modifications elles-mêmes.

ThiefMaster
la source
1
Je pensais aux numéros de ligne réels. Merci quand même.
wei
Je doute en quelque sorte qu'il veuille un outil GUI pour cela.
ThiefMaster
31

git diff master --compact-summary

La sortie est:

 src/app/components/common/sidebar/toolbar/toolbar.component.html   |  2 +-
 src/app/components/common/sidebar/toolbar/toolbar.component.scss   |  2 --

C'est exactement ce dont vous avez besoin. Même format que lorsque vous effectuez une validation ou que vous tirez de nouvelles validations à distance.

PS: C'est câblé que personne n'a répondu de cette façon.

Seitbekir Seidametov
la source
1
Ce n'était pas précisé. Il fonctionne à partir de la version 2.18 publiée il y a un an.
Seitbekir Seidametov
Parfait. Cela a fonctionné pour moi et la réponse est parfaite.
Victor
15

1) Mon préféré:

git diff --name-status

Ajoute l'état du fichier, par exemple:

A   new_file.txt
M   modified_file.txt 
D   deleted_file.txt

2) Si vous voulez des statistiques, alors:

git diff --stat

affichera quelque chose comme:

new_file.txt         |  50 +
modified_file.txt    | 100 +-
deleted_file         |  40 -

3) Enfin, si vous ne voulez vraiment que les noms de fichiers:

git diff --name-only

Montrera simplement:

new_file.txt
modified_file.txt
deleted_file
Feiteira
la source
4

Affiche les noms de fichiers et le nombre / nombre de lignes qui ont changé dans chaque fichier entre maintenant et le commit spécifié:

git diff --stat <commit-hash>
masterxilo
la source
2

Je sais que c'est une vieille question mais sous Windows, cela filtre la sortie git dans les fichiers et les numéros de ligne modifiés:

(git diff -p --stat) | findstr "@@ --git"

diff --git a/dir1/dir2/file.cpp b/dir1/dir2/file.cpp
@@ -47,6 +47,7 @@ <some function name>
@@ -97,7 +98,7 @@ <another functon name>

Pour extraire les fichiers et les lignes modifiées, c'est un peu plus de travail:

for /f "tokens=3,4* delims=-+ " %f in ('^(git diff -p --stat .^) ^| findstr ^"@@ --git^"') do @echo %f

a/dir1/dir2/file.cpp
47,7
98,7
Ger O'Donnell
la source
1

La sortie la plus propre, c'est-à-dire les noms / chemins de fichiers uniquement, est fournie avec

git diff-tree --no-commit-id --name-only -r

HTH

RedFred
la source
0

Sur git version 2.17.1, il n'y a pas d'indicateur intégré pour atteindre cet objectif.

Voici un exemple de commande pour filtrer le nom de fichier et les numéros de ligne d'un diff unifié:

git diff --unified=0 | grep -Po '^diff --cc \K.*|^@@@( -[0-9]+,[0-9]+){2} \+\K[0-9]+(?=(,[0-9]+)? @@@)' | paste -s -d':'

Par exemple, le diff unifié:

$ git diff --unified=0
diff --cc foobar
index b436f31,df63c58..0000000
--- a/foobar
+++ b/foobar
@@@ -1,2 -1,2 +1,6 @@@ Line abov
++<<<<<<< HEAD
 +bar
++=======
+ foo
++>>>>>>> Commit message

Aura pour résultat:

❯ git diff --unified=0 | grep -Po '^diff --cc \K.*|^@@@( -[0-9]+,[0-9]+){2} \+\K[0-9]+(?=(,[0-9]+)? @@@)' | paste -s -d':'
foobar:1

Pour faire correspondre la sortie des commandes dans les résultats de correspondance grep courants:

$ git diff --unified=0 | grep -Po '^diff --cc \K.*|^@@@( -[0-9]+,[0-9]+){2} \+\K[0-9]+(?=(,[0-9]+)? )| @@@.*' | sed -e '0~3{s/ @@@[ ]\?//}' | sed '2~3 s/$/\n1/g' | sed "N;N;N;s/\n/:/g"
foobar:1:1:Line abov
  1. grep -Po '^diff --cc \K.*|^@@@( -[0-9]+,[0-9]+){2} \+\K[0-9]+(?=(,[0-9]+)? ): Faire correspondre le nom de fichier de diff --cc <filename>OU Faire correspondre le numéro de ligne de @@@ <from-file-range> <from-file-range> <to-file-range>OU Faire correspondre le texte restant après @@@.
  2. sed -e '0~3{s/ @@@[ ]\?//}': Supprimer @@@[ ]\?de chaque 3ème ligne pour obtenir le contexte optionnel de 1 ligne avant ++<<<<<<< HEAD.
  3. sed '2~3 s/$/\n1/g': Ajoutez \n1toutes les 3 lignes entre la 2e et la 3e ligne pour le numéro de colonne.
  4. sed "N;N;N;s/\n/:/g": Joignez toutes les 3 lignes avec a :.
Edgar Lee
la source
0

J'utilise grepcomme solution naïve.

$ git diff | grep -A2 -- '---'

un exemple de sortie:

--- a/fileA.txt
+++ b/fileA.txt
@@ -0,0 +1,132 @@
--
--- a/B/fileC.txt
+++ b/B/fileC.txt
@@ -33663,3 +33663,68800 @@ word_38077.png,Latin
--
--- a/D/fileE.txt
+++ b/D/fileE.txt
@@ -17998,3 +17998,84465 @@ word_23979.png,Latin
--
--- a/F
+++ b/F
@@ -1 +1 @@

Vous pouvez peut-être voir une sortie colorée. Il vous aide à lire facilement les sorties.

plhn
la source