Jak sprawić, by git-diff i git log ignorowały nowe i usunięte pliki?

155

Czasami jest kilka zmienionych plików razem z nowymi, usuniętymi i / lub zmienionymi nazwami plików. Robiąc git difflub git-logchciałbym je pominąć, aby móc lepiej dostrzec modyfikacje.

Właściwie najlepiej byłoby wymienić nazwy nowych i usuniętych plików bez ich zawartości. W przypadku „starego” zmienionego na „nowy” chciałbym opcjonalnie uzyskać różnicę między „starym” a „nowym”.

maaartinus
źródło

Odpowiedzi:

217

Ta --diff-filteropcja działa zarówno z, jak diffi log.

Używam --diff-filter=Mdużo, co ogranicza wyjścia różnicowe tylko do modyfikacji zawartości.

Aby wykryć zmiany nazw i kopie i użyć ich w wyniku porównywania, możesz użyć odpowiednio -Mi -C, razem z opcjami Ri .C--diff-filter

CB Bailey
źródło
3
Użycie z git logtym spowoduje całkowite zignorowanie zatwierdzeń, które tylko dodają i / lub usuwają pliki.
qqx
7
Czy istnieje sposób, aby faktycznie wykluczyć tylko jeden typ danych? Coś jak--diff-filter=!D
Kamil Dziedzic
24
@Kamil Tak, jest. Cytat z dokumentacji:Also, these upper-case letters can be downcased to exclude. E.g. --diff-filter=ad excludes added and deleted paths.
LambdaCruiser
62
  • Oficjalny dokument:
--diff-filter=[(A|C|D|M|R|T|U|X|B)…​[*]]

Wybierz tylko pliki, które są Dodane (A), Skopiowane (C), Usunięte (D), Zmodyfikowane (M), Zmienione (R), mają zmieniony ich typ (np. Zwykły plik, łącze symboliczne, podmoduł,…), nie są scalone (U), są nieznane (X) lub ich parowanie zostało przerwane (B). Można użyć dowolnej kombinacji znaków filtru (w tym żadnego).

Po dodaniu * (wszystko lub brak) do kombinacji wszystkie ścieżki są wybierane, jeśli istnieje plik, który spełnia inne kryteria porównania; jeśli nie ma pliku spełniającego inne kryteria, nic nie jest wybierane.

Również te wielkie litery można zmniejszyć, aby wykluczyć. Np. --Diff-filter = ad wyklucza dodane i usunięte ścieżki.

Przykład: pokaż tylko dodane, zmienione, zmodyfikowane pliki, wyklucz usunięte pliki:

git diff --diff-filter=ACM
TeeTracker
źródło
2
Dobra uwaga na temat używania opcji małych liter do wykluczania ścieżek i opcji wielkich liter do dołączania ścieżek.
stuyam
-3

UPDATE: Akceptowane odpowiedź Charles Bailey jest prawidłowa; pożądana funkcjonalność jest już wbudowana w git.

Zostawię tę odpowiedź tutaj, ponieważ może ona dostarczyć pomysłów na rzeczy, które nie są wbudowane w git.


git diffpokazuje nowe i usunięte pliki, porównując je z /dev/null. Nie powinno być zbyt trudne napisanie czegoś (sam bym użył Perla), który wyszukuje /dev/nulli filtruje następujące wiersze aż do następnego porównania. Wtedy git diff ... | the-filter.

Pliki o zmienionych nazwach to inna sprawa; Nie mam (jeszcze) dobrej odpowiedzi na to pytanie.

Keith Thompson
źródło
To jest w porządku, ale w ten sposób straciłbym możliwość korzystania z pagera (mniej) tylko w razie potrzeby, prawda?
maaartinus
@maaartinus: Tak sądzę; Nie pomyślałem o tym. (Osobiście mogę ustawić git pager na „kot” i wykorzystania ... | lessw sposób jawny.) Można spojrzeć na less„s -Elub -Fopcja (choć w moim systemie nie pozwól mi zobaczyć wyjście).
Keith Thompson
OK, w porządku, ale spójrz na drugą odpowiedź.
maaartinus