Kann ich 'git diff' nur die Zeilennummern UND geänderten Dateinamen machen?


275

Diese Frage erfordert "Zeilennummern". Wenn Sie sich nicht für Zeilennummern in der Ausgabe interessieren, lesen Sie diese Frage und Antwort .


Grundsätzlich möchte ich nicht den geänderten Inhalt sehen, sondern nur die Dateinamen und Zeilennummern.


Ich bin neugierig, sind Zeilennummern ohne Code wirklich nützlich? Oder möchten Sie die Anzahl der Zeilen ändern?
Andrew Marshall

Nun, nicht besonders, aber ich brauche es, um zu markieren, wo ich meinen Code geändert habe.
Wei

1
Eine Verwendung davon wäre, die Informationen mit einem Code-Coverage-Bericht zu kombinieren, um zu beurteilen, ob der neue oder geänderte Code in einem Commit durch Tests abgedeckt wird
AntonyG

@AntonyG Ich habe diese Frage gefunden, als ich versucht habe, ein Dienstprogramm zu erstellen, das genau dasselbe tut (Abdeckung gegenüber geänderten Zeilen). Haben Sie es geschafft, den Bericht zu erstellen? Wenn ja, haben Sie es irgendwo veröffentlicht?
Andrew Newdigate

@ AndrewNewdigate es wäre ein cooles Tool, aber ich habe es nie gebaut. Als ich auf diese Frage stieß, führte ich eine andere Art der Verarbeitung von Code-Coverage-Ergebnissen durch, konnte jedoch die für die Umsetzung meines Vorschlags erforderliche Zeit nicht rechtfertigen
AntonyG

Antworten:


70

Hinweis: Wenn Sie nur nach den Namen geänderter Dateien suchen ( ohne die Zeilennummern für geänderte Zeilen) , klicken Sie einfach auf diesen Link, um hier eine andere Antwort zu erhalten .


Es gibt keine eingebaute Option dafür (und ich denke auch nicht, dass es so nützlich ist), aber es ist möglich, dies in Git mit Hilfe eines "externen Diff" -Skripts zu tun.

Hier ist eine ziemlich beschissene; Es liegt an Ihnen, die Ausgabe so zu korrigieren, wie Sie es möchten.

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

Einzelheiten zu "external diff" finden Sie in der Beschreibung GIT_EXTERNAL_DIFFauf der Git-Handbuchseite (um Zeile 700, ziemlich nahe am Ende).


1
Vielen Dank. Ich habe tatsächlich ein ähnliches Skript geschrieben, nachdem bestätigt wurde, dass es dafür keine eingebauten Optionen gibt :)
Wei

Piping to | grep -o '^[0-9]*'gibt Ihnen nur Zahlen, vorausgesetzt, Sie interessieren sich nicht für die rechte Seite.
GKFX

1
@ DylanYoung ja; Um die angezeigten Dateien einzuschränken, fügen Sie hinzu, --diff-filter=...wo das ...Teil die Art von Änderungen ist, die Sie sehen möchten: Mfür geänderte, Ahinzugefügte, Dgelöschte und andere gemäß der git diffDokumentation.
Torek

@Sventies: Das hat das OP nicht verlangt, wie ich oben in meiner Antwort feststelle. Er will nicht nur die Namen der Dateien. Er will die Namen mit Zeilennummern .
Torek

Fair genug @torek :)
Sventies

831

So einfach:

git diff --name-only

Geh raus und diff!


88
Dies ist möglicherweise die Antwort, nach der die meisten Leute suchen, wenn sie diese Seite anzeigen (es war für mich). Die ursprüngliche Frage, in der Zeilennummern ausdrücklich erwähnt werden, wird jedoch nicht beantwortet.
Pieter Müller

12
Dies sollte NICHT die akzeptierte Antwort sein, da dies nur die Hälfte des Problems löst. Sie müssen immer noch ausgeben, welche Zeilen (für jede Datei) geändert wurden.
Adamwong246

Das ist es! Ich habe genau nach diesem Schalter gesucht!
Adam Arold

Warum nicht "Git Status" verwenden? Außerdem werden die nicht verfolgten Dateien angezeigt.
Naveen Paul

1
@ JimmyPaul, weil du dich manchmal schon verpflichtet hast. Zum Beispiel müssen Sie geänderte Dateien zwischen Master und Ihrem aktuellen erweiterten Zweig git diff --name-only master..HEAD
auflisten

68

Zeilennummern wie in Anzahl der geänderten Zeilen oder die tatsächlichen Zeilennummern, die die Änderungen enthalten? Wenn Sie die Anzahl der geänderten Zeilen möchten, verwenden Sie git diff --stat. Dies gibt Ihnen eine Anzeige wie folgt:

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

Es gibt keine Möglichkeit, die Zeilennummern der Änderungen selbst abzurufen.


1
Ich dachte an die tatsächlichen Zeilennummern. Trotzdem danke.
Wei

Ich bezweifle irgendwie, dass er dafür ein GUI-Tool will.
ThiefMaster

29

git diff master --compact-summary

Ausgabe ist:

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

Genau das brauchen Sie. Gleiches Format wie beim Festschreiben oder Abrufen neuer Festschreibungen von der Fernbedienung.

PS: Das ist verdrahtet, dass niemand so geantwortet hat.


1
Das wurde nicht angegeben. Es funktioniert ab 2.18 vor einem Jahr veröffentlicht.
Seitbekir Seidametov

Perfekt. Das hat bei mir funktioniert und die Resonanz ist perfekt.
Victor

15

1) Mein Favorit:

git diff --name-status

Stellt den Dateistatus voran, z.

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

2) Wenn Sie Statistiken wünschen, dann:

git diff --stat

zeigt so etwas wie:

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

3) Schließlich, wenn Sie wirklich nur die Dateinamen wollen:

git diff --name-only

Wird einfach zeigen:

new_file.txt
modified_file.txt
deleted_file

4

Zeigt die Dateinamen und die Anzahl / Anzahl der Zeilen an, die sich in jeder Datei zwischen jetzt und dem angegebenen Commit geändert haben:

git diff --stat <commit-hash>

2

Ich weiß, dass dies eine alte Frage ist, aber unter Windows filtert dies die Git-Ausgabe in die Dateien und ändert die Zeilennummern:

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

Das Extrahieren der Dateien und der geänderten Zeilen ist etwas aufwendiger:

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

Die sauberste Ausgabe, dh nur Dateinamen / Pfade, wird mit geliefert

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

HTH


0

Ein git version 2.17.1, um diesen Zweck zu erreichen , gibt es keine eingebaute Flagge .

Hier ist ein Beispielbefehl zum Herausfiltern des Dateinamens und der Zeilennummern aus einem einheitlichen Diff:

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

Zum Beispiel das einheitliche Diff:

$ 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

Wird darin enden, dass:

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

So passen Sie die Ausgabe von Befehlen in allgemeinen Grep-Übereinstimmungsergebnissen an:

$ 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]+)? ): Dateiname von diff --cc <filename>OR abgleichen Zeilennummer von @@@ <from-file-range> <from-file-range> <to-file-range>OR abgleichen Restlichen Text nachher abgleichen @@@.
  2. sed -e '0~3{s/ @@@[ ]\?//}': Entfernen Sie @@@[ ]\?aus jeder dritten Zeile, um den optionalen 1-Zeilen-Kontext zu erhalten ++<<<<<<< HEAD.
  3. sed '2~3 s/$/\n1/g': Fügen Sie \n1alle 3 Zeilen zwischen der 2. und 3. Zeile für die Spaltennummer hinzu.
  4. sed "N;N;N;s/\n/:/g": Verbinde alle 3 Zeilen mit a :.

0

Ich benutze grepals naive Lösung.

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

ein Ausgabebeispiel:

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

Vielleicht können Sie eine farbige Ausgabe sehen. Es hilft Ihnen, Ausgaben einfach zu lesen.

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.