Jak filtrować różnice w git na podstawie rozszerzeń plików?

152

Czy istnieje opcja ograniczenia git diffdo podanego zestawu rozszerzeń plików?

vfclists
źródło

Odpowiedzi:

227

Tak, jeśli upewnisz się, że git rozszerza glob, a nie twoją powłokę, będzie pasował na każdym poziomie, więc coś takiego (cudzysłowy są ważne) powinno działać dobrze.

git diff -- '*.c' '*.h'
CB Bailey
źródło
1
Ok, moja wersja gita była za stara. Działa zgodnie z reklamą w wersji 1.7.8. Doskonały.
Mat
3
Mój pracował przy ekspansji klamry, a lagit diff -- *.{c,h,etc}
Matt Fletcher
9
ważna jest podwójna kreska np. git diff master HEAD -- "*filename.txt"przydatna jest równieżgit diff master HEAD --name-only
neaumusic
Pojedyncze cudzysłowy ( '') są również ważne! git diff -- src/*.jspowinno byćgit diff -- 'src/*.js'
Nickofthyme
1
Należy to również zrobić w katalogu głównym repozytorium git.
John Jiang
10

Aby dołączyć pliki rekurencyjnie (w tym bieżący katalog), działało to dla mnie:

git diff -- '***.py'
Bohumir Zamecnik
źródło
1
Dla mnie to najlepsze rozwiązanie. Możesz także wykluczyć niektóre pliki / katalogi. Na przykład:git diff -- '***.py' ':!.Trashes'
Bartosz
Co robią potrójne gwiazdki (w porównaniu z pojedynczą gwiazdką)?
Jann Poppinga
IIRC podwójna gwiazdka oznacza (prawdopodobnie) zagnieżdżone katalogi (nawet puste), a pojedyncza gwiazdka i .py oznaczają nazwę pliku. Powinien to być plik * .py w katalogu bieżącym lub dowolnym zagnieżdżonym katalogu.
Bohumir Zamecnik
8

Albo użyj globstar twojej powłoki (który wykonuje wyszukiwanie rekurencyjne) 1 , 2 :

shopt -s globstar 
git diff -- *.py **/*.py

lub użyj znajdź:

find -name '*.py' -print0 | xargs -0 git diff --

Oba są nazwami specjalnymi i dowodami białych znaków. Chociaż możesz chcieć filtrować w poszukiwaniu katalogów z rozszerzeniem .py :)


1 git diff -- {.,**}/*.pyZwykle lubię to robić

2 Gdy globstar jest włączony, git diff -- **/*.pyzawiera już ./*.py. Na stronie podręcznika Basha: 'Jeśli następuje po nim /, dwa sąsiednie * s będą pasować tylko do katalogów i podkatalogów.'

sehe
źródło
4

W przypadku prostych wzorców plików wydaje się to działać:

$ git ls-files -zm '*.txt' | xargs --null git diff

Bezpieczne odstępy, a także możesz mieć wiele rozszerzeń:

$ git ls-files -zm '*.h|*.c|*.cpp' | xargs --null git diff
Mata
źródło
3

Argument wiersza poleceń dla rozszerzenia.

git diff *.py

Alternatywnie możesz przejść finddo git diff:

find . -name '*.py' -type f | git diff --
hughdbrown
źródło
proszę uczynić odpowiedź bardziej czytelną. Mogłeś wystarczyć z git diff *.pykrzyczącymi nagłówkami i bez nich
patrz
1
„Nagłówki okrzyków” były #-komentarzami w skrypcie powłoki.
hughdbrown,
To jedyne rozwiązanie, które działało u mnie, cudzysłowy (itp.) Nie działały w wierszu poleceń systemu Windows.
Ed Bayiates
1

Zgodnie z testami na git w wersji 2.18.0, rozszerzenie pliku powinno być cytowane w cudzysłowie. Jeśli chcesz znaleźć ostatnie różnice między repozytorium lokalnym a zdalnym, po ściągnięciu możesz użyć:

git diff YourBranchName@{1} YourBranchName --name-only "*.YourFileExtionsion"

Na przykład:

git diff master@{1} origin/master --name-only "*.cs"
marjan.javid
źródło
1
Udało mi się, gdy podałem - przed rozszerzeniem, w ten sposóbgit diff master@{1} origin/master --name-only -- "*.cs"
333
0

Żadna z powyższych odpowiedzi nie wydaje się działać dla mnie w git bashsystemie Windows. Nie jestem pewien, czy chodzi o wersję (używam 1.8.4), czy o Windows / bash; również w moim przypadku chciałem porównać dwie gałęzie, w których każda gałąź miała dodatkowe pliki, których nie było w drugiej gałęzi (stąd te oparte na „znalezieniu” są niedopuszczalne).

W każdym razie zadziałało to dla mnie (w moim przykładzie szukanie różnicy między plikami Pythona):

git diff branch1 branch2 -- `git diff --summary branch1 branch2 | egrep '\.py$' | cut -d ' ' -f 5`
Yonatan
źródło
Ten stackoverflow.com/a/8554987/4233229 działa, ale w systemie Windows trzeba używać podwójnych cudzysłowów zamiast apostrofów
lcnittl
0

git diff pokaże tylko różnice w plikach niestacjonarnych.

Znalazłem to pytanie, ponieważ chciałem wykluczyć .infopliki z git diff. Osiągnąłem to, ustawiając go za pomocą git add *.info, co zmniejsza liczbę pozostałych plików.

Alan Whitelaw
źródło
0

Skończyło się na tym:

commit=<the_commit_hash_goes_here> && git diff --name-only $commit | grep -i Test | egrep -v '\.sql$' | xargs git diff $commit --

Pokazuje różnice dla określonego zatwierdzenia tylko wtedy, gdy nazwa pliku zawiera słowo „test” (bez rozróżniania wielkości liter) i nie kończy się na .sql, zmodyfikuj potok zgodnie z potrzebą.

MatrixManAtYrService
źródło