web-dev-qa-db-fra.com

Puis-je faire en sorte que 'git diff' affiche uniquement les noms de fichiers modifiés et les numéros de ligne?

En gros, je ne veux pas voir le contenu modifié, mais uniquement les noms de fichier et les numéros de ligne.

222
wei

Remarque: si vous recherchez simplement les noms des fichiers modifiés ( sans les numéros de ligne pour les lignes modifiées), c'est facile, cliquez sur ce lien pour obtenir 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 aussi utile que cela soit), mais il est possible de le faire dans git, à l'aide d'un " diff externe "script.

En voici un assez nul. ce sera à vous de régler 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 "external diff", voir la description de GIT_EXTERNAL_DIFF dans page de manuel de git (autour de la ligne 700, assez proche de la fin).

59
torek

Si facile:

git diff --name-only

Allez-y et diff!

713
phreakhead

Les numéros de ligne comme le nombre de lignes modifiées ou les numéros de ligne 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.

60
ThiefMaster

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 un commit ou que vous extrayez de nouveaux commits à distance.

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

3

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

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

1) Mon préféré:

git diff --name-status

Ajoute au préalable 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

montrera quelque chose comme:

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

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

git diff --name-only

Montrera simplement:

new_file.txt
modified_file.txt
deleted_file
2
Feiteira

git diff à pour chaque ligne entre les fichiers

git diff --name-only pour lister les fichiers de noms

2
mrjusepelo

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

(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, cela nécessite 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
2
Ger O'Donnell

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

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

HTH

1
RedFred

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

Voici un exemple de commande permettant de 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 les résultats des commandes dans les résultats de correspondance grep communs:

$ 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]+)? ): Correspond au nom de fichier de diff --cc <filename> OR Correspond au numéro de ligne de @@@ <from-file-range> <from-file-range> <to-file-range> OR Fait correspondre le texte restant après @@@.
  2. sed -e '0~3{s/ @@@[ ]\?//}': Supprimez @@@[ ]\? de chaque troisième ligne pour obtenir le contexte facultatif d'une ligne avant ++<<<<<<< HEAD.
  3. sed '2~3 s/$/\n1/g': Ajoutez \n1 toutes les 3 lignes entre la 2ème et la 3ème ligne pour le numéro de colonne.
  4. sed "N;N;N;s/\n/:/g": Joignez toutes les 3 lignes avec un :.
0
Edgar Lee