Posso rendere 'git diff' solo i numeri di riga E i nomi dei file modificati?


276

Questa domanda richiede "numeri di riga", se non ti interessano i numeri di riga nell'output, vedi questa domanda e rispondi .


Fondamentalmente, non voglio vedere il contenuto modificato, ma solo i nomi dei file e i numeri di riga.


Sono curioso, i numeri di riga sono davvero utili senza codice? O vuoi cambiare il numero di righe?
Andrew Marshall,

bene, non particolarmente, ma ne ho bisogno per aggiungere un segnalibro dove ho cambiato il mio codice.
wei

1
Un utilizzo di questo sarebbe quello di combinare le informazioni con un rapporto sulla copertura del codice, per valutare se il codice nuovo o modificato in un commit è coperto da test
AntonyG

@AntonyG Ho trovato questa domanda mentre cercavo di creare un'utilità che fa esattamente la stessa cosa (copertura vs linee modificate). Sei riuscito a compilare il rapporto? In tal caso, l'hai pubblicato ovunque?
Andrew Newdigate,

@AndrewNewdigate sarebbe uno strumento interessante ma non l'ho mai costruito. Stavo facendo un altro tipo di elaborazione dei risultati della copertura del codice quando mi sono imbattuto in questa domanda, ma non potevo giustificare il tempo necessario per attuare il mio suggerimento
AntonyG

Risposte:


70

Nota: se stai solo cercando i nomi dei file modificati ( senza i numeri di riga per le linee che sono state modificate), è facile, fai clic su questo link per un'altra risposta qui .


Non esiste un'opzione integrata per questo (e non penso che sia altrettanto utile), ma è possibile farlo in git, con l'aiuto di uno script "diff esterno".

Eccone uno piuttosto schifoso; dipenderà da te correggere l'output nel modo desiderato.

#! /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 '^[<>-]'

Per i dettagli su "diff esterno" vedere la descrizione GIT_EXTERNAL_DIFFnella pagina del manuale di git (intorno alla linea 700, abbastanza vicino alla fine).


1
Grazie. In realtà ho scritto uno script simile, dopo essere stato confermato che non ci sono opzioni integrate per questo, :)
wei

Il piping a | grep -o '^[0-9]*'ti dà solo numeri, supponendo che non ti interessi del lato destro.
GKFX,

1
@DylanYoung yes; per limitare i file mostrati, aggiungere --diff-filter=...dove la ...parte è il tipo di modifiche che si desidera vedere: Mper modificate, Aper aggiunte, Dper cancellate e altre per la git diffdocumentazione.
Torek,

@Sventies: non è quello che l'OP ha richiesto, come noto all'inizio della mia risposta. Non vuole solo i nomi dei file. Vuole i nomi con i numeri di riga .
Torek,

Abbastanza giusto @torek :)
Sventies

833

Così facile:

git diff --name-only

Vai avanti e diff!


88
Questa è la risposta che molte persone cercano quando visualizzano questa pagina (era per me). Tuttavia, non risponde alla domanda originale, che menziona specificamente i numeri di riga.
Pieter Müller,

12
Questa NON dovrebbe essere la risposta accettata in quanto risolve solo metà del problema, è comunque necessario emettere quali righe (per ogni file) sono state modificate.
adamwong246,

Questo è tutto! Stavo cercando esattamente questo interruttore!
Adam Arold,

Perché non usare "git status"? Ti dice anche i file non tracciati.
Naveen Paul,

1
@JimmyPaul perché a volte ti sei già impegnato. Ad esempio, devi elencare il file modificato tra master e il tuo ramo avanzato correntegit diff --name-only master..HEAD
Hettomei,

68

Numeri di riga come nel numero di righe modificate o numeri di riga effettivi contenenti le modifiche? Se si desidera il numero di righe modificate, utilizzare git diff --stat. Questo ti dà un display come questo:

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

Non esiste alcuna opzione per ottenere i numeri di riga delle modifiche stesse.


1
Stavo pensando ai numeri di riga effettivi. Grazie comunque.
wei

In qualche modo dubito che voglia uno strumento GUI per questo.
ThiefMaster

30

git diff master --compact-summary

L'output è:

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

Questo è esattamente ciò di cui hai bisogno. Stesso formato di quando si esegue il commit o si estraggono nuovi commit da remoto.

PS: È cablato a cui nessuno ha risposto in questo modo.


1
Questo non è stato specificato. Funziona dalla 2.18 rilasciata un anno fa.
Seitbekir Seidametov,

Perfetto. Questo ha funzionato per me e la risposta è perfetta.
Victor

15

1) Il mio preferito:

git diff --name-status

Prepara lo stato del file, ad esempio:

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

2) Se vuoi statistiche, allora:

git diff --stat

mostrerà qualcosa come:

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

3) Infine, se vuoi davvero solo i nomi dei file:

git diff --name-only

Mostrerà semplicemente:

new_file.txt
modified_file.txt
deleted_file

4

Mostra i nomi dei file e la quantità / nubmer delle righe che sono cambiate in ciascun file tra ora e il commit specificato:

git diff --stat <commit-hash>

2

So che questa è una vecchia domanda ma su Windows, questo filtra l'output git nei file e ha cambiato i numeri di riga:

(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>

Per estrarre i file e le righe modificate da questo è un po 'più di lavoro:

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

1

Viene fornito l'output più pulito, ovvero solo nomi / percorsi di file

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

HTH


0

Su git version 2.17.1, non esiste un flag incorporato per raggiungere questo scopo.

Ecco un comando di esempio per filtrare il nome del file e i numeri di riga da un diff unificato:

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

Ad esempio, il diff unificato:

$ 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

Si tradurrà in:

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

Per abbinare l'output dei comandi nei risultati della partita grep comuni:

$ 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]+)? ): Trova il nome file da diff --cc <filename>OR trova il numero di riga da @@@ <from-file-range> <from-file-range> <to-file-range>OR Trova il testo rimanente dopo @@@.
  2. sed -e '0~3{s/ @@@[ ]\?//}': Rimuovi @@@[ ]\?da ogni terza riga per ottenere prima il contesto opzionale di 1 riga ++<<<<<<< HEAD.
  3. sed '2~3 s/$/\n1/g': Aggiungi \n1ogni 3 righe tra la seconda e la terza riga per il numero di colonna.
  4. sed "N;N;N;s/\n/:/g": Unisci ogni 3 righe con a :.

0

Uso grepcome una soluzione ingenua.

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

un esempio di output:

--- 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 @@

Forse puoi vedere un risultato colorato. Ti aiuta a leggere facilmente gli output.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.