Czy mogę sprawić, aby „git diff” zawierał tylko numery wierszy ORAZ zmienione nazwy plików?


276

To pytanie wymaga „numerów linii”, jeśli nie przejmujesz się numerami linii na wyjściu, zobacz to pytanie i odpowiedź .


Zasadniczo nie chcę widzieć zmienionej zawartości, tylko nazwy plików i numery linii.


Jestem ciekawy, czy numery linii są naprawdę przydatne bez kodu? A może chcesz zmienić liczbę linii?
Andrew Marshall

cóż, nie szczególnie, ale potrzebuję go, aby dodać zakładkę do miejsca, w którym zmieniłem kod.
wei

1
Jednym z takich zastosowań byłoby połączenie informacji z raportem pokrycia kodu, aby ocenić, czy nowy lub zmodyfikowany kod w zatwierdzeniu jest objęty testami
AntonyG

@AntonyG Znalazłem to pytanie, próbując zbudować narzędzie, które robi dokładnie to samo (zasięg vs zmienione linie). Czy udało Ci się zbudować raport? Jeśli tak, czy opublikowałeś go gdzieś?
Andrew Newdigate

@AndrewNewdigate byłoby fajnym narzędziem, ale nigdy go nie zbudowałem. Kiedy natknąłem się na to pytanie, zajmowałem się przetwarzaniem wyników pokrycia kodu, ale nie mogłem uzasadnić czasu potrzebnego na wdrożenie mojej sugestii
AntonyG

Odpowiedzi:


70

Uwaga: jeśli jesteś po prostu patrząc na nazwiska zmienionych plików ( bez tych numerów linii do linii, które zostały zmienione), który jest łatwy, kliknij ten link do innej odpowiedzi tutaj .


Nie ma wbudowanej opcji do tego (i nie sądzę, że to wszystko, co przydatne, albo), ale to jest możliwe, aby zrobić to w git, z pomocą „zewnętrznym diff” skryptu.

Oto dość gówniany; od Ciebie zależy, czy naprawisz wyjście tak, jak chcesz.

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

Aby uzyskać szczegółowe informacje na temat „zewnętrznego diff”, zobacz opis GIT_EXTERNAL_DIFFna stronie podręcznika git (około linii 700, całkiem blisko końca).


1
Dzięki. Właściwie napisałem podobny skrypt, po potwierdzeniu, że nie ma wbudowanych opcji tego, :)
wei

Piping do | grep -o '^[0-9]*'daje tylko liczby, zakładając, że nie obchodzi cię prawa strona.
GKFX,

1
@DylanYoung tak; aby ograniczyć liczbę wyświetlanych plików, dodaj, --diff-filter=...gdzie ...część jest rodzajem zmian, które chcesz zobaczyć: Mzmodyfikowane, Adodane, Dusunięte i inne zgodnie z git diffdokumentacją.
torek

@ Sventies: nie o to prosił OP, jak zauważam na górze mojej odpowiedzi. Nie chce samych nazw plików. Chce nazwiska z numerami linii .
trek

Wystarczająco fair @torek :)
Sventies

831

Tak łatwo:

git diff --name-only

Idź naprzód i różnicuj się!


88
Jest to odpowiedź, której większość osób szuka, oglądając tę ​​stronę (to było dla mnie). Jednak nie odpowiada na pierwotne pytanie, które konkretnie wymienia numery linii.
Pieter Müller,

12
To NIE powinna być zaakceptowana odpowiedź, ponieważ rozwiązuje tylko połowę problemu - nadal musisz podać, które wiersze (dla każdego pliku) zostały zmienione.
adamwong246

Otóż ​​to! Właśnie szukałem tego przełącznika!
Adam Arold

Dlaczego nie użyć „statusu git”? Informuje również o nieśledzonych plikach.
Naveen Paul

1
@JimmyPaul, ponieważ czasami już się zobowiązałeś. Na przykład musisz wymienić zmieniony plik między master a obecną gałęzią zaawansowanągit diff --name-only master..HEAD
Hettomei

68

Numery linii jak w liczbie zmienionych linii czy rzeczywiste numery linii zawierające zmiany? Jeśli chcesz liczbę zmienionych linii, użyj git diff --stat. To daje ci taki ekran:

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

Nie ma opcji, aby uzyskać numery linii samych zmian.


1
Myślałem o rzeczywistych numerach linii. W każdym razie dzięki.
wei

Jakoś wątpię, czy chce do tego narzędzia GUI.
ThiefMaster

30

git diff master --compact-summary

Dane wyjściowe to:

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

Właśnie tego potrzebujesz. Ten sam format, jak podczas dokonywania zmian lub wyciągania nowych zatwierdzeń ze zdalnego.

PS: To jest takie, że nikt nie odpowiedział w ten sposób.


1
To nie zostało określone. Działa z wersji 2.18 wydanej rok temu.
Seitbekir Seidametov

Idealny. To zadziałało dla mnie i odpowiedź jest idealna.
Victor

15

1) Mój ulubiony:

git diff --name-status

Przygotowuje status pliku, np .:

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

2) Jeśli chcesz statystyki, to:

git diff --stat

pokaże coś takiego:

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

3) Wreszcie, jeśli naprawdę chcesz tylko nazwy plików:

git diff --name-only

Po prostu pokaże:

new_file.txt
modified_file.txt
deleted_file

4

Pokazuje nazwy plików i ilość / liczbę wierszy, które zmieniły się w każdym pliku między teraz a określonym zatwierdzeniem:

git diff --stat <commit-hash>

2

Wiem, że to stare pytanie, ale w systemie Windows filtruje dane wyjściowe git do plików i zmienia numery linii:

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

Aby wyodrębnić pliki i zmienione linie z tego, jest trochę więcej pracy:

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

Dostarczane jest najczystsze wyjście, tj. Tylko nazwy plików / ścieżki

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

HTH


0

On git version 2.17.1, nie ma wbudowaną flagi , aby osiągnąć ten cel.

Oto przykładowe polecenie, aby odfiltrować nazwę pliku i numery linii ze zunifikowanego pliku różnicowego:

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

Na przykład zunifikowany plik różnicowy:

$ 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

Spowoduje to:

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

Aby dopasować dane wyjściowe poleceń we wspólnych wynikach dopasowania grep:

$ 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]+)? ): Dopasuj nazwę pliku z diff --cc <filename>LUB Dopasuj numer linii z @@@ <from-file-range> <from-file-range> <to-file-range>LUB Dopasuj pozostały tekst po @@@.
  2. sed -e '0~3{s/ @@@[ ]\?//}': Usuń @@@[ ]\?z co 3 linii, aby wcześniej uzyskać opcjonalny kontekst 1 linii ++<<<<<<< HEAD.
  3. sed '2~3 s/$/\n1/g': Dodaj \n1co 3 linie między 2. i 3. linią dla numeru kolumny.
  4. sed "N;N;N;s/\n/:/g": Połącz co 3 linie za pomocą :.

0

Używam grepjako naiwne rozwiązanie.

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

przykład wyjściowy:

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

Może widzisz kolorowe wyjście. Pomaga w łatwym odczycie wyników.

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.